version 1.115, 2005/10/06 16:45:53
|
version 1.157, 2006/08/15 10:37:59
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.114 2005/10/04 00:29:25 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.156 2006/08/15 07:28:25 hyc Exp $ */ |
/* syncprov.c - syncrepl provider */ |
/* syncprov.c - syncrepl provider */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 2004-2005 The OpenLDAP Foundation. |
* Copyright 2004-2006 The OpenLDAP Foundation. |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 122 typedef struct syncprov_info_t {
|
Line 122 typedef struct syncprov_info_t {
|
int si_chktime; |
int si_chktime; |
int si_numops; /* number of ops since last checkpoint */ |
int si_numops; /* number of ops since last checkpoint */ |
int si_nopres; /* Skip present phase */ |
int si_nopres; /* Skip present phase */ |
|
int si_usehint; /* use reload hint */ |
time_t si_chklast; /* time of last checkpoint */ |
time_t si_chklast; /* time of last checkpoint */ |
Avlnode *si_mods; /* entries being modified */ |
Avlnode *si_mods; /* entries being modified */ |
sessionlog *si_logs; |
sessionlog *si_logs; |
Line 382 findbase_cb( Operation *op, SlapReply *r
|
Line 383 findbase_cb( Operation *op, SlapReply *r
|
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
} |
} |
|
|
|
static Filter generic_filter = { LDAP_FILTER_PRESENT, { 0 }, NULL }; |
|
static struct berval generic_filterstr = BER_BVC("(objectclass=*)"); |
|
|
static int |
static int |
syncprov_findbase( Operation *op, fbase_cookie *fc ) |
syncprov_findbase( Operation *op, fbase_cookie *fc ) |
{ |
{ |
Line 421 syncprov_findbase( Operation *op, fbase_
|
Line 425 syncprov_findbase( Operation *op, fbase_
|
fop.ors_tlimit = SLAP_NO_LIMIT; |
fop.ors_tlimit = SLAP_NO_LIMIT; |
fop.ors_attrs = slap_anlist_no_attrs; |
fop.ors_attrs = slap_anlist_no_attrs; |
fop.ors_attrsonly = 1; |
fop.ors_attrsonly = 1; |
|
fop.ors_filter = &generic_filter; |
|
fop.ors_filterstr = generic_filterstr; |
|
|
fop.o_bd->bd_info = on->on_info->oi_orig; |
fop.o_bd->bd_info = on->on_info->oi_orig; |
rc = fop.o_bd->be_search( &fop, &frs ); |
rc = fop.o_bd->be_search( &fop, &frs ); |
Line 444 syncprov_findbase( Operation *op, fbase_
|
Line 450 syncprov_findbase( Operation *op, fbase_
|
case LDAP_SCOPE_SUBTREE: |
case LDAP_SCOPE_SUBTREE: |
fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ); |
fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ); |
break; |
break; |
#ifdef LDAP_SCOPE_SUBORDINATE |
|
case LDAP_SCOPE_SUBORDINATE: |
case LDAP_SCOPE_SUBORDINATE: |
fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ) && |
fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ) && |
!dn_match( fc->fdn, &fc->fss->s_base ); |
!dn_match( fc->fdn, &fc->fss->s_base ); |
break; |
break; |
#endif |
|
} |
} |
} |
} |
|
|
Line 477 syncprov_findbase( Operation *op, fbase_
|
Line 481 syncprov_findbase( Operation *op, fbase_
|
* CSN, and generate Present records for them. We always collect this result |
* CSN, and generate Present records for them. We always collect this result |
* in SyncID sets, even if there's only one match. |
* in SyncID sets, even if there's only one match. |
*/ |
*/ |
#define FIND_MAXCSN 1 |
typedef enum find_csn_t { |
#define FIND_CSN 2 |
FIND_MAXCSN = 1, |
#define FIND_PRESENT 3 |
FIND_CSN = 2, |
|
FIND_PRESENT = 3 |
|
} find_csn_t; |
|
|
static int |
static int |
findmax_cb( Operation *op, SlapReply *rs ) |
findmax_cb( Operation *op, SlapReply *rs ) |
Line 502 findcsn_cb( Operation *op, SlapReply *rs
|
Line 508 findcsn_cb( Operation *op, SlapReply *rs
|
{ |
{ |
slap_callback *sc = op->o_callback; |
slap_callback *sc = op->o_callback; |
|
|
if ( rs->sr_type == REP_SEARCH && rs->sr_err == LDAP_SUCCESS ) { |
/* We just want to know that at least one exists, so it's OK if |
|
* we exceed the unchecked limit. |
|
*/ |
|
if ( rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED || |
|
(rs->sr_type == REP_SEARCH && rs->sr_err == LDAP_SUCCESS )) { |
sc->sc_private = (void *)1; |
sc->sc_private = (void *)1; |
} |
} |
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
Line 558 findpres_cb( Operation *op, SlapReply *r
|
Line 568 findpres_cb( Operation *op, SlapReply *r
|
} |
} |
|
|
static int |
static int |
syncprov_findcsn( Operation *op, int mode ) |
syncprov_findcsn( Operation *op, find_csn_t mode ) |
{ |
{ |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
syncprov_info_t *si = on->on_bi.bi_private; |
syncprov_info_t *si = on->on_bi.bi_private; |
Line 575 syncprov_findcsn( Operation *op, int mod
|
Line 585 syncprov_findcsn( Operation *op, int mod
|
#else |
#else |
AttributeAssertion eq = { NULL, BER_BVNULL }; |
AttributeAssertion eq = { NULL, BER_BVNULL }; |
#endif |
#endif |
int i, rc = LDAP_SUCCESS; |
|
fpres_cookie pcookie; |
fpres_cookie pcookie; |
sync_control *srs = NULL; |
sync_control *srs = NULL; |
int findcsn_retry = 1; |
struct slap_limits_set fc_limits; |
|
int i, rc = LDAP_SUCCESS, findcsn_retry = 1; |
|
|
if ( mode != FIND_MAXCSN ) { |
if ( mode != FIND_MAXCSN ) { |
srs = op->o_controls[slap_cids.sc_LDAPsync]; |
srs = op->o_controls[slap_cids.sc_LDAPsync]; |
Line 629 again:
|
Line 639 again:
|
/* On retry, look for <= */ |
/* On retry, look for <= */ |
} else { |
} else { |
cf.f_choice = LDAP_FILTER_LE; |
cf.f_choice = LDAP_FILTER_LE; |
|
fop.ors_limit = &fc_limits; |
|
fc_limits.lms_s_unchecked = 1; |
fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)", |
fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)", |
cf.f_av_value.bv_val ); |
cf.f_av_value.bv_val ); |
} |
} |
Line 728 syncprov_free_syncop( syncops *so )
|
Line 740 syncprov_free_syncop( syncops *so )
|
|
|
/* Send a persistent search response */ |
/* Send a persistent search response */ |
static int |
static int |
syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode) |
syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, |
|
Entry **e, int mode ) |
{ |
{ |
slap_overinst *on = opc->son; |
slap_overinst *on = opc->son; |
|
|
Line 808 syncprov_qplay( Operation *op, slap_over
|
Line 821 syncprov_qplay( Operation *op, slap_over
|
syncres *sr; |
syncres *sr; |
Entry *e; |
Entry *e; |
opcookie opc; |
opcookie opc; |
int rc; |
int rc = 0; |
|
|
opc.son = on; |
opc.son = on; |
op->o_bd->bd_info = (BackendInfo *)on->on_info; |
op->o_bd->bd_info = (BackendInfo *)on->on_info; |
Line 861 syncprov_qtask( void *ctx, void *arg )
|
Line 874 syncprov_qtask( void *ctx, void *arg )
|
struct re_s *rtask = arg; |
struct re_s *rtask = arg; |
syncops *so = rtask->arg; |
syncops *so = rtask->arg; |
slap_overinst *on = so->s_op->o_private; |
slap_overinst *on = so->s_op->o_private; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf; |
Operation *op; |
Operation *op; |
BackendDB be; |
BackendDB be; |
|
|
op = (Operation *)opbuf; |
op = (Operation *) &opbuf; |
*op = *so->s_op; |
*op = *so->s_op; |
op->o_hdr = (Opheader *)(op+1); |
op->o_hdr = (Opheader *)(op+1); |
op->o_controls = (void **)(op->o_hdr+1); |
op->o_controls = (void **)(op->o_hdr+1); |
Line 884 syncprov_qtask( void *ctx, void *arg )
|
Line 897 syncprov_qtask( void *ctx, void *arg )
|
op->o_private = NULL; |
op->o_private = NULL; |
op->o_callback = NULL; |
op->o_callback = NULL; |
|
|
syncprov_qplay( op, on, so ); |
(void)syncprov_qplay( op, on, so ); |
|
|
/* decrement use count... */ |
/* decrement use count... */ |
syncprov_free_syncop( so ); |
syncprov_free_syncop( so ); |
Line 898 syncprov_qtask( void *ctx, void *arg )
|
Line 911 syncprov_qtask( void *ctx, void *arg )
|
return NULL; |
return NULL; |
} |
} |
|
|
|
/* Start the task to play back queued psearch responses */ |
|
static void |
|
syncprov_qstart( syncops *so ) |
|
{ |
|
int wake=0; |
|
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); |
|
if ( !so->s_qtask ) { |
|
so->s_qtask = ldap_pvt_runqueue_insert( &slapd_rq, RUNQ_INTERVAL, |
|
syncprov_qtask, so, "syncprov_qtask", |
|
so->s_op->o_conn->c_peer_name.bv_val ); |
|
++so->s_inuse; |
|
wake = 1; |
|
} else { |
|
if (!ldap_pvt_runqueue_isrunning( &slapd_rq, so->s_qtask ) && |
|
!so->s_qtask->next_sched.tv_sec ) { |
|
so->s_qtask->interval.tv_sec = 0; |
|
ldap_pvt_runqueue_resched( &slapd_rq, so->s_qtask, 0 ); |
|
so->s_qtask->interval.tv_sec = RUNQ_INTERVAL; |
|
++so->s_inuse; |
|
wake = 1; |
|
} |
|
} |
|
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); |
|
if ( wake ) |
|
slap_wake_listener(); |
|
} |
|
|
/* Queue a persistent search response */ |
/* Queue a persistent search response */ |
static int |
static int |
syncprov_qresp( opcookie *opc, syncops *so, int mode ) |
syncprov_qresp( opcookie *opc, syncops *so, int mode ) |
Line 911 syncprov_qresp( opcookie *opc, syncops *
|
Line 951 syncprov_qresp( opcookie *opc, syncops *
|
sr->s_dn.bv_len = opc->sdn.bv_len; |
sr->s_dn.bv_len = opc->sdn.bv_len; |
sr->s_mode = mode; |
sr->s_mode = mode; |
sr->s_isreference = opc->sreference; |
sr->s_isreference = opc->sreference; |
sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, opc->sdn.bv_val ); |
sr->s_ndn.bv_val = lutil_strcopy( sr->s_dn.bv_val, |
|
opc->sdn.bv_val ) + 1; |
sr->s_ndn.bv_len = opc->sndn.bv_len; |
sr->s_ndn.bv_len = opc->sndn.bv_len; |
*(sr->s_ndn.bv_val++) = '\0'; |
sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, |
sr->s_uuid.bv_val = lutil_strcopy( sr->s_ndn.bv_val, opc->sndn.bv_val ); |
opc->sndn.bv_val ) + 1; |
sr->s_uuid.bv_len = opc->suuid.bv_len; |
sr->s_uuid.bv_len = opc->suuid.bv_len; |
*(sr->s_uuid.bv_val++) = '\0'; |
AC_MEMCPY( sr->s_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len ); |
sr->s_csn.bv_val = lutil_strcopy( sr->s_uuid.bv_val, opc->suuid.bv_val ); |
sr->s_csn.bv_val = sr->s_uuid.bv_val + sr->s_uuid.bv_len + 1; |
sr->s_csn.bv_len = opc->sctxcsn.bv_len; |
sr->s_csn.bv_len = opc->sctxcsn.bv_len; |
strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val ); |
strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val ); |
|
|
Line 935 syncprov_qresp( opcookie *opc, syncops *
|
Line 976 syncprov_qresp( opcookie *opc, syncops *
|
so->s_flags |= PS_FIND_BASE; |
so->s_flags |= PS_FIND_BASE; |
} |
} |
if ( so->s_flags & PS_IS_DETACHED ) { |
if ( so->s_flags & PS_IS_DETACHED ) { |
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); |
syncprov_qstart( so ); |
if ( !so->s_qtask ) { |
|
so->s_qtask = ldap_pvt_runqueue_insert( &slapd_rq, RUNQ_INTERVAL, |
|
syncprov_qtask, so, "syncprov_qtask", |
|
so->s_op->o_conn->c_peer_name.bv_val ); |
|
++so->s_inuse; |
|
} else { |
|
if (!ldap_pvt_runqueue_isrunning( &slapd_rq, so->s_qtask ) && |
|
!so->s_qtask->next_sched.tv_sec ) { |
|
so->s_qtask->interval.tv_sec = 0; |
|
ldap_pvt_runqueue_resched( &slapd_rq, so->s_qtask, 0 ); |
|
so->s_qtask->interval.tv_sec = RUNQ_INTERVAL; |
|
++so->s_inuse; |
|
} |
|
} |
|
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); |
|
} |
} |
ldap_pvt_thread_mutex_unlock( &so->s_mutex ); |
ldap_pvt_thread_mutex_unlock( &so->s_mutex ); |
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
Line 1036 syncprov_matchops( Operation *op, opcook
|
Line 1062 syncprov_matchops( Operation *op, opcook
|
int rc; |
int rc; |
struct berval newdn; |
struct berval newdn; |
int freefdn = 0; |
int freefdn = 0; |
|
BackendDB *b0 = op->o_bd, db; |
|
|
fc.fdn = &op->o_req_ndn; |
fc.fdn = &op->o_req_ndn; |
/* compute new DN */ |
/* compute new DN */ |
Line 1048 syncprov_matchops( Operation *op, opcook
|
Line 1075 syncprov_matchops( Operation *op, opcook
|
freefdn = 1; |
freefdn = 1; |
} |
} |
if ( op->o_tag != LDAP_REQ_ADD ) { |
if ( op->o_tag != LDAP_REQ_ADD ) { |
|
if ( !SLAP_ISOVERLAY( op->o_bd )) { |
|
db = *op->o_bd; |
|
op->o_bd = &db; |
|
} |
op->o_bd->bd_info = (BackendInfo *)on->on_info; |
op->o_bd->bd_info = (BackendInfo *)on->on_info; |
rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e ); |
rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e ); |
/* If we're sending responses now, make a copy and unlock the DB */ |
/* If we're sending responses now, make a copy and unlock the DB */ |
Line 1057 syncprov_matchops( Operation *op, opcook
|
Line 1088 syncprov_matchops( Operation *op, opcook
|
e = e2; |
e = e2; |
} |
} |
op->o_bd->bd_info = (BackendInfo *)on; |
op->o_bd->bd_info = (BackendInfo *)on; |
if ( rc ) return; |
if ( rc ) { |
|
op->o_bd = b0; |
|
return; |
|
} |
} else { |
} else { |
e = op->ora_e; |
e = op->ora_e; |
} |
} |
Line 1155 syncprov_matchops( Operation *op, opcook
|
Line 1189 syncprov_matchops( Operation *op, opcook
|
if ( freefdn ) { |
if ( freefdn ) { |
op->o_tmpfree( fc.fdn->bv_val, op->o_tmpmemctx ); |
op->o_tmpfree( fc.fdn->bv_val, op->o_tmpmemctx ); |
} |
} |
|
op->o_bd = b0; |
} |
} |
|
|
static int |
static int |
Line 1212 syncprov_checkpoint( Operation *op, Slap
|
Line 1247 syncprov_checkpoint( Operation *op, Slap
|
syncprov_info_t *si = on->on_bi.bi_private; |
syncprov_info_t *si = on->on_bi.bi_private; |
Modifications mod; |
Modifications mod; |
Operation opm; |
Operation opm; |
|
SlapReply rsm = { 0 }; |
struct berval bv[2]; |
struct berval bv[2]; |
slap_callback cb = {0}; |
slap_callback cb = {0}; |
int manage = get_manageDSAit(op); |
|
|
|
mod.sml_values = bv; |
/* If ctxcsn is empty, delete it */ |
bv[1].bv_val = NULL; |
if ( BER_BVISEMPTY( &si->si_ctxcsn )) { |
bv[0] = si->si_ctxcsn; |
mod.sml_values = NULL; |
|
} else { |
|
mod.sml_values = bv; |
|
bv[1].bv_val = NULL; |
|
bv[0] = si->si_ctxcsn; |
|
} |
mod.sml_nvalues = NULL; |
mod.sml_nvalues = NULL; |
mod.sml_desc = slap_schema.si_ad_contextCSN; |
mod.sml_desc = slap_schema.si_ad_contextCSN; |
mod.sml_op = LDAP_MOD_REPLACE; |
mod.sml_op = LDAP_MOD_REPLACE; |
Line 1234 syncprov_checkpoint( Operation *op, Slap
|
Line 1274 syncprov_checkpoint( Operation *op, Slap
|
opm.o_req_ndn = op->o_bd->be_nsuffix[0]; |
opm.o_req_ndn = op->o_bd->be_nsuffix[0]; |
opm.o_bd->bd_info = on->on_info->oi_orig; |
opm.o_bd->bd_info = on->on_info->oi_orig; |
opm.o_managedsait = SLAP_CONTROL_NONCRITICAL; |
opm.o_managedsait = SLAP_CONTROL_NONCRITICAL; |
opm.o_bd->be_modify( &opm, rs ); |
SLAP_DBFLAGS( opm.o_bd ) |= SLAP_DBFLAG_NOLASTMOD; |
opm.o_managedsait = manage; |
opm.o_bd->be_modify( &opm, &rsm ); |
|
SLAP_DBFLAGS( opm.o_bd ) ^= SLAP_DBFLAG_NOLASTMOD; |
|
if ( mod.sml_next != NULL ) { |
|
slap_mods_free( mod.sml_next, 1 ); |
|
} |
} |
} |
|
|
static void |
static void |
syncprov_add_slog( Operation *op, struct berval *csn ) |
syncprov_add_slog( Operation *op ) |
{ |
{ |
opcookie *opc = op->o_callback->sc_private; |
opcookie *opc = op->o_callback->sc_private; |
slap_overinst *on = opc->son; |
slap_overinst *on = opc->son; |
Line 1251 syncprov_add_slog( Operation *op, struct
|
Line 1295 syncprov_add_slog( Operation *op, struct
|
{ |
{ |
/* Allocate a record. UUIDs are not NUL-terminated. */ |
/* Allocate a record. UUIDs are not NUL-terminated. */ |
se = ch_malloc( sizeof( slog_entry ) + opc->suuid.bv_len + |
se = ch_malloc( sizeof( slog_entry ) + opc->suuid.bv_len + |
csn->bv_len + 1 ); |
op->o_csn.bv_len + 1 ); |
se->se_next = NULL; |
se->se_next = NULL; |
se->se_tag = op->o_tag; |
se->se_tag = op->o_tag; |
|
|
se->se_uuid.bv_val = (char *)(se+1); |
se->se_uuid.bv_val = (char *)(&se[1]); |
AC_MEMCPY( se->se_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len ); |
AC_MEMCPY( se->se_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len ); |
se->se_uuid.bv_len = opc->suuid.bv_len; |
se->se_uuid.bv_len = opc->suuid.bv_len; |
|
|
se->se_csn.bv_val = se->se_uuid.bv_val + opc->suuid.bv_len; |
se->se_csn.bv_val = se->se_uuid.bv_val + opc->suuid.bv_len; |
AC_MEMCPY( se->se_csn.bv_val, csn->bv_val, csn->bv_len ); |
AC_MEMCPY( se->se_csn.bv_val, op->o_csn.bv_val, op->o_csn.bv_len ); |
se->se_csn.bv_val[csn->bv_len] = '\0'; |
se->se_csn.bv_val[op->o_csn.bv_len] = '\0'; |
se->se_csn.bv_len = csn->bv_len; |
se->se_csn.bv_len = op->o_csn.bv_len; |
|
|
ldap_pvt_thread_mutex_lock( &sl->sl_mutex ); |
ldap_pvt_thread_mutex_lock( &sl->sl_mutex ); |
if ( sl->sl_head ) { |
if ( sl->sl_head ) { |
Line 1279 syncprov_add_slog( Operation *op, struct
|
Line 1323 syncprov_add_slog( Operation *op, struct
|
sl->sl_mincsn.bv_len = se->se_csn.bv_len; |
sl->sl_mincsn.bv_len = se->se_csn.bv_len; |
ch_free( se ); |
ch_free( se ); |
sl->sl_num--; |
sl->sl_num--; |
if ( !sl->sl_head ) { |
|
sl->sl_tail = NULL; |
|
} |
|
} |
} |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
} |
} |
Line 1300 playlog_cb( Operation *op, SlapReply *rs
|
Line 1341 playlog_cb( Operation *op, SlapReply *rs
|
/* enter with sl->sl_mutex locked, release before returning */ |
/* enter with sl->sl_mutex locked, release before returning */ |
static void |
static void |
syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, |
syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl, |
struct berval *oldcsn, struct berval *ctxcsn ) |
sync_control *srs, struct berval *ctxcsn ) |
{ |
{ |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; |
slog_entry *se; |
slog_entry *se; |
int i, j, ndel, num, nmods, mmods; |
int i, j, ndel, num, nmods, mmods; |
|
char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
BerVarray uuids; |
BerVarray uuids; |
|
struct berval delcsn; |
|
|
if ( !sl->sl_num ) { |
if ( !sl->sl_num ) { |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
Line 1318 syncprov_playlog( Operation *op, SlapRep
|
Line 1361 syncprov_playlog( Operation *op, SlapRep
|
|
|
uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) + |
uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) + |
num * UUID_LEN, op->o_tmpmemctx ); |
num * UUID_LEN, op->o_tmpmemctx ); |
|
|
uuids[0].bv_val = (char *)(uuids + num + 1); |
uuids[0].bv_val = (char *)(uuids + num + 1); |
|
|
|
delcsn.bv_len = 0; |
|
delcsn.bv_val = cbuf; |
|
|
/* Make a copy of the relevant UUIDs. Put the Deletes up front |
/* Make a copy of the relevant UUIDs. Put the Deletes up front |
* and everything else at the end. Do this first so we can |
* and everything else at the end. Do this first so we can |
* unlock the list mutex. |
* unlock the list mutex. |
*/ |
*/ |
for ( se=sl->sl_head; se; se=se->se_next ) { |
for ( se=sl->sl_head; se; se=se->se_next ) { |
if ( ber_bvcmp( &se->se_csn, oldcsn ) < 0 ) continue; |
if ( ber_bvcmp( &se->se_csn, &srs->sr_state.ctxcsn ) <= 0 ) continue; |
if ( ber_bvcmp( &se->se_csn, ctxcsn ) > 0 ) break; |
if ( ber_bvcmp( &se->se_csn, ctxcsn ) > 0 ) break; |
if ( se->se_tag == LDAP_REQ_DELETE ) { |
if ( se->se_tag == LDAP_REQ_DELETE ) { |
j = i; |
j = i; |
i++; |
i++; |
|
AC_MEMCPY( cbuf, se->se_csn.bv_val, se->se_csn.bv_len ); |
|
delcsn.bv_len = se->se_csn.bv_len; |
|
delcsn.bv_val[delcsn.bv_len] = '\0'; |
} else { |
} else { |
nmods++; |
nmods++; |
j = num - nmods; |
j = num - nmods; |
Line 1411 syncprov_playlog( Operation *op, SlapRep
|
Line 1459 syncprov_playlog( Operation *op, SlapRep
|
mf.f_av_value = uuids[i]; |
mf.f_av_value = uuids[i]; |
cb.sc_private = NULL; |
cb.sc_private = NULL; |
fop.ors_slimit = 1; |
fop.ors_slimit = 1; |
|
frs.sr_nentries = 0; |
rc = fop.o_bd->be_search( &fop, &frs ); |
rc = fop.o_bd->be_search( &fop, &frs ); |
|
|
/* If entry was not found, add to delete list */ |
/* If entry was not found, add to delete list */ |
Line 1421 syncprov_playlog( Operation *op, SlapRep
|
Line 1470 syncprov_playlog( Operation *op, SlapRep
|
fop.o_bd->bd_info = (BackendInfo *)on; |
fop.o_bd->bd_info = (BackendInfo *)on; |
} |
} |
if ( ndel ) { |
if ( ndel ) { |
|
struct berval cookie; |
|
|
|
slap_compose_sync_cookie( op, &cookie, &delcsn, srs->sr_state.rid ); |
uuids[ndel].bv_val = NULL; |
uuids[ndel].bv_val = NULL; |
syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL, 0, uuids, 1 ); |
syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 ); |
|
op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); |
} |
} |
|
op->o_tmpfree( uuids, op->o_tmpmemctx ); |
} |
} |
|
|
static int |
static int |
Line 1436 syncprov_op_response( Operation *op, Sla
|
Line 1490 syncprov_op_response( Operation *op, Sla
|
|
|
if ( rs->sr_err == LDAP_SUCCESS ) |
if ( rs->sr_err == LDAP_SUCCESS ) |
{ |
{ |
struct berval maxcsn = BER_BVNULL, curcsn = BER_BVNULL; |
struct berval maxcsn = BER_BVNULL; |
char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
|
|
/* Update our context CSN */ |
/* Update our context CSN */ |
cbuf[0] = '\0'; |
cbuf[0] = '\0'; |
ldap_pvt_thread_mutex_lock( &si->si_csn_mutex ); |
ldap_pvt_thread_mutex_lock( &si->si_csn_mutex ); |
slap_get_commit_csn( op, &maxcsn, &curcsn ); |
slap_get_commit_csn( op, &maxcsn ); |
if ( !BER_BVISNULL( &maxcsn ) ) { |
if ( !BER_BVISNULL( &maxcsn ) ) { |
strcpy( cbuf, maxcsn.bv_val ); |
strcpy( cbuf, maxcsn.bv_val ); |
if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn ) > 0 ) { |
if ( ber_bvcmp( &maxcsn, &si->si_ctxcsn ) > 0 ) { |
Line 1503 syncprov_op_response( Operation *op, Sla
|
Line 1557 syncprov_op_response( Operation *op, Sla
|
|
|
/* Add any log records */ |
/* Add any log records */ |
if ( si->si_logs && op->o_tag != LDAP_REQ_ADD ) { |
if ( si->si_logs && op->o_tag != LDAP_REQ_ADD ) { |
syncprov_add_slog( op, &curcsn ); |
syncprov_add_slog( op ); |
} |
} |
|
|
} |
} |
Line 1738 syncprov_detach_op( Operation *op, synco
|
Line 1792 syncprov_detach_op( Operation *op, synco
|
op2->ors_filterstr.bv_val = ptr; |
op2->ors_filterstr.bv_val = ptr; |
strcpy( ptr, so->s_filterstr.bv_val ); |
strcpy( ptr, so->s_filterstr.bv_val ); |
op2->ors_filterstr.bv_len = so->s_filterstr.bv_len; |
op2->ors_filterstr.bv_len = so->s_filterstr.bv_len; |
op2->ors_filter = str2filter( ptr ); |
op2->ors_filter = filter_dup( op->ors_filter, NULL ); |
so->s_op = op2; |
so->s_op = op2; |
|
|
/* Copy any cached group ACLs individually */ |
/* Copy any cached group ACLs individually */ |
Line 1760 syncprov_detach_op( Operation *op, synco
|
Line 1814 syncprov_detach_op( Operation *op, synco
|
LDAP_STAILQ_INSERT_TAIL( &op->o_conn->c_ops, op2, o_next ); |
LDAP_STAILQ_INSERT_TAIL( &op->o_conn->c_ops, op2, o_next ); |
so->s_flags |= PS_IS_DETACHED; |
so->s_flags |= PS_IS_DETACHED; |
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); |
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); |
|
|
|
/* Prevent anyone else from trying to send a result for this op */ |
|
op->o_abandon = 1; |
} |
} |
|
|
static int |
static int |
Line 1782 syncprov_search_response( Operation *op,
|
Line 1839 syncprov_search_response( Operation *op,
|
return SLAP_CB_CONTINUE; |
return SLAP_CB_CONTINUE; |
} |
} |
a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN ); |
a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN ); |
|
if ( a == NULL && rs->sr_operational_attrs != NULL ) { |
|
a = attr_find( rs->sr_operational_attrs, slap_schema.si_ad_entryCSN ); |
|
} |
if ( a ) { |
if ( a ) { |
/* Make sure entry is less than the snaphot'd contextCSN */ |
/* Make sure entry is less than the snapshot'd contextCSN */ |
if ( ber_bvcmp( &a->a_nvals[0], &ss->ss_ctxcsn ) > 0 ) |
if ( ber_bvcmp( &a->a_nvals[0], &ss->ss_ctxcsn ) > 0 ) { |
|
Debug( LDAP_DEBUG_SYNC, "Entry %s CSN %s greater than snapshot %s\n", |
|
rs->sr_entry->e_name.bv_val, |
|
a->a_nvals[0].bv_val, |
|
ss->ss_ctxcsn.bv_val ); |
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
|
} |
|
|
/* Don't send the ctx entry twice */ |
/* Don't send the ctx entry twice */ |
if ( !BER_BVISNULL( &srs->sr_state.ctxcsn ) && |
if ( !BER_BVISNULL( &srs->sr_state.ctxcsn ) && |
bvmatch( &a->a_nvals[0], &srs->sr_state.ctxcsn ) ) |
bvmatch( &a->a_nvals[0], &srs->sr_state.ctxcsn ) ) { |
|
Debug( LDAP_DEBUG_SYNC, "Entry %s CSN %s matches ctx %s\n", |
|
rs->sr_entry->e_name.bv_val, |
|
a->a_nvals[0].bv_val, |
|
srs->sr_state.ctxcsn.bv_val ); |
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
|
} |
} |
} |
rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2, |
rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2, |
op->o_tmpmemctx ); |
op->o_tmpmemctx ); |
Line 1814 syncprov_search_response( Operation *op,
|
Line 1884 syncprov_search_response( Operation *op,
|
op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); |
op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); |
} else { |
} else { |
/* It's RefreshAndPersist, transition to Persist phase */ |
/* It's RefreshAndPersist, transition to Persist phase */ |
syncprov_sendinfo( op, rs, ( ss->ss_present && rs->sr_nentries ) ? |
syncprov_sendinfo( op, rs, ss->ss_present ? |
LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE, |
LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE, |
&cookie, 1, NULL, 0 ); |
&cookie, 1, NULL, 0 ); |
op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); |
op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx ); |
Line 1826 syncprov_search_response( Operation *op,
|
Line 1896 syncprov_search_response( Operation *op,
|
ss->ss_so->s_flags ^= PS_IS_REFRESHING; |
ss->ss_so->s_flags ^= PS_IS_REFRESHING; |
|
|
syncprov_detach_op( op, ss->ss_so, on ); |
syncprov_detach_op( op, ss->ss_so, on ); |
|
|
|
/* If there are queued responses, fire them off */ |
|
if ( ss->ss_so->s_res ) |
|
syncprov_qstart( ss->ss_so ); |
ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex ); |
ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex ); |
|
|
return LDAP_SUCCESS; |
return LDAP_SUCCESS; |
Line 1875 syncprov_op_search( Operation *op, SlapR
|
Line 1949 syncprov_op_search( Operation *op, SlapR
|
/* syncprov_findbase expects to be called as a callback... */ |
/* syncprov_findbase expects to be called as a callback... */ |
sc.sc_private = &opc; |
sc.sc_private = &opc; |
opc.son = on; |
opc.son = on; |
|
ldap_pvt_thread_mutex_init( &so.s_mutex ); |
cb = op->o_callback; |
cb = op->o_callback; |
op->o_callback = ≻ |
op->o_callback = ≻ |
rs->sr_err = syncprov_findbase( op, &fc ); |
rs->sr_err = syncprov_findbase( op, &fc ); |
op->o_callback = cb; |
op->o_callback = cb; |
|
ldap_pvt_thread_mutex_destroy( &so.s_mutex ); |
|
|
if ( rs->sr_err != LDAP_SUCCESS ) { |
if ( rs->sr_err != LDAP_SUCCESS ) { |
send_ldap_result( op, rs ); |
send_ldap_result( op, rs ); |
Line 1931 syncprov_op_search( Operation *op, SlapR
|
Line 2007 syncprov_op_search( Operation *op, SlapR
|
sl=si->si_logs; |
sl=si->si_logs; |
if ( sl ) { |
if ( sl ) { |
ldap_pvt_thread_mutex_lock( &sl->sl_mutex ); |
ldap_pvt_thread_mutex_lock( &sl->sl_mutex ); |
if ( ber_bvcmp( &srs->sr_state.ctxcsn, &sl->sl_mincsn ) >= 0 ) { |
/* Are there any log entries, and is the consumer state |
|
* present in the session log? |
|
*/ |
|
if ( sl->sl_num > 0 && ber_bvcmp( &srs->sr_state.ctxcsn, &sl->sl_mincsn ) >= 0 ) { |
do_present = 0; |
do_present = 0; |
/* mutex is unlocked in playlog */ |
/* mutex is unlocked in playlog */ |
syncprov_playlog( op, rs, sl, &srs->sr_state.ctxcsn, &ctxcsn ); |
syncprov_playlog( op, rs, sl, srs, &ctxcsn ); |
} else { |
} else { |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); |
} |
} |
Line 1942 syncprov_op_search( Operation *op, SlapR
|
Line 2021 syncprov_op_search( Operation *op, SlapR
|
/* Is the CSN still present in the database? */ |
/* Is the CSN still present in the database? */ |
if ( syncprov_findcsn( op, FIND_CSN ) != LDAP_SUCCESS ) { |
if ( syncprov_findcsn( op, FIND_CSN ) != LDAP_SUCCESS ) { |
/* No, so a reload is required */ |
/* No, so a reload is required */ |
#if 0 /* the consumer doesn't seem to send this hint */ |
/* the 2.2 consumer doesn't send this hint */ |
if ( op->o_sync_rhint == 0 ) { |
if ( si->si_usehint && srs->sr_rhint == 0 ) { |
send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" ); |
send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" ); |
return rs->sr_err; |
return rs->sr_err; |
} |
} |
#endif |
|
} else { |
} else { |
gotstate = 1; |
gotstate = 1; |
/* If changed and doing Present lookup, send Present UUIDs */ |
/* If changed and doing Present lookup, send Present UUIDs */ |
Line 2068 syncprov_operational(
|
Line 2146 syncprov_operational(
|
enum { |
enum { |
SP_CHKPT = 1, |
SP_CHKPT = 1, |
SP_SESSL, |
SP_SESSL, |
SP_NOPRES |
SP_NOPRES, |
|
SP_USEHINT |
}; |
}; |
|
|
static ConfigDriver sp_cf_gen; |
static ConfigDriver sp_cf_gen; |
Line 2086 static ConfigTable spcfg[] = {
|
Line 2165 static ConfigTable spcfg[] = {
|
sp_cf_gen, "( OLcfgOvAt:1.3 NAME 'olcSpNoPresent' " |
sp_cf_gen, "( OLcfgOvAt:1.3 NAME 'olcSpNoPresent' " |
"DESC 'Omit Present phase processing' " |
"DESC 'Omit Present phase processing' " |
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
|
{ "syncprov-reloadhint", NULL, 2, 2, 0, ARG_ON_OFF|ARG_MAGIC|SP_USEHINT, |
|
sp_cf_gen, "( OLcfgOvAt:1.4 NAME 'olcSpReloadHint' " |
|
"DESC 'Observe Reload Hint in Request control' " |
|
"SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL }, |
{ NULL, NULL, 0, 0, 0, ARG_IGNORED } |
{ NULL, NULL, 0, 0, 0, ARG_IGNORED } |
}; |
}; |
|
|
Line 2133 sp_cf_gen(ConfigArgs *c)
|
Line 2216 sp_cf_gen(ConfigArgs *c)
|
rc = 1; |
rc = 1; |
} |
} |
break; |
break; |
|
case SP_USEHINT: |
|
if ( si->si_usehint ) { |
|
c->value_int = 1; |
|
} else { |
|
rc = 1; |
|
} |
|
break; |
} |
} |
return rc; |
return rc; |
} else if ( c->op == LDAP_MOD_DELETE ) { |
} else if ( c->op == LDAP_MOD_DELETE ) { |
Line 2153 sp_cf_gen(ConfigArgs *c)
|
Line 2243 sp_cf_gen(ConfigArgs *c)
|
else |
else |
rc = LDAP_NO_SUCH_ATTRIBUTE; |
rc = LDAP_NO_SUCH_ATTRIBUTE; |
break; |
break; |
|
case SP_USEHINT: |
|
if ( si->si_usehint ) |
|
si->si_usehint = 0; |
|
else |
|
rc = LDAP_NO_SUCH_ATTRIBUTE; |
|
break; |
} |
} |
return rc; |
return rc; |
} |
} |
switch ( c->type ) { |
switch ( c->type ) { |
case SP_CHKPT: |
case SP_CHKPT: |
si->si_chkops = atoi( c->argv[1] ); |
if ( lutil_atoi( &si->si_chkops, c->argv[1] ) != 0 ) { |
si->si_chktime = atoi( c->argv[2] ) * 60; |
sprintf( c->msg, "%s unable to parse checkpoint ops # \"%s\"", |
|
c->argv[0], c->argv[1] ); |
|
Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 ); |
|
return ARG_BAD_CONF; |
|
} |
|
if ( si->si_chkops <= 0 ) { |
|
sprintf( c->msg, "%s invalid checkpoint ops # \"%d\"", |
|
c->argv[0], si->si_chkops ); |
|
Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 ); |
|
return ARG_BAD_CONF; |
|
} |
|
if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) { |
|
sprintf( c->msg, "%s unable to parse checkpoint time \"%s\"", |
|
c->argv[0], c->argv[1] ); |
|
Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 ); |
|
return ARG_BAD_CONF; |
|
} |
|
if ( si->si_chktime <= 0 ) { |
|
sprintf( c->msg, "%s invalid checkpoint time \"%d\"", |
|
c->argv[0], si->si_chkops ); |
|
Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 ); |
|
return ARG_BAD_CONF; |
|
} |
|
si->si_chktime *= 60; |
break; |
break; |
case SP_SESSL: { |
case SP_SESSL: { |
sessionlog *sl; |
sessionlog *sl; |
Line 2187 sp_cf_gen(ConfigArgs *c)
|
Line 2306 sp_cf_gen(ConfigArgs *c)
|
case SP_NOPRES: |
case SP_NOPRES: |
si->si_nopres = c->value_int; |
si->si_nopres = c->value_int; |
break; |
break; |
|
case SP_USEHINT: |
|
si->si_usehint = c->value_int; |
|
break; |
} |
} |
return rc; |
return rc; |
} |
} |
Line 2215 syncprov_db_open(
|
Line 2337 syncprov_db_open(
|
slap_overinst *on = (slap_overinst *) be->bd_info; |
slap_overinst *on = (slap_overinst *) be->bd_info; |
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
|
|
Connection conn; |
Connection conn = { 0 }; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf = { 0 }; |
char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
Operation *op = (Operation *)opbuf; |
Operation *op = (Operation *) &opbuf; |
Entry *e; |
Entry *e; |
Attribute *a; |
Attribute *a; |
int rc; |
int rc; |
void *thrctx = NULL; |
void *thrctx = NULL; |
|
|
|
if ( !SLAP_LASTMOD( be )) { |
|
Debug( LDAP_DEBUG_ANY, |
|
"syncprov_db_open: invalid config, lastmod must be enabled\n", 0, 0, 0 ); |
|
return -1; |
|
} |
|
|
if ( slapMode & SLAP_TOOL_MODE ) { |
if ( slapMode & SLAP_TOOL_MODE ) { |
return 0; |
return 0; |
} |
} |
Line 2259 syncprov_db_open(
|
Line 2387 syncprov_db_open(
|
strcpy( ctxcsnbuf, si->si_ctxcsnbuf ); |
strcpy( ctxcsnbuf, si->si_ctxcsnbuf ); |
} |
} |
be_entry_release_rw( op, e, 0 ); |
be_entry_release_rw( op, e, 0 ); |
op->o_bd->bd_info = (BackendInfo *)on; |
if ( !BER_BVISEMPTY( &si->si_ctxcsn ) ) { |
op->o_req_dn = be->be_suffix[0]; |
op->o_bd->bd_info = (BackendInfo *)on; |
op->o_req_ndn = be->be_nsuffix[0]; |
op->o_req_dn = be->be_suffix[0]; |
op->ors_scope = LDAP_SCOPE_SUBTREE; |
op->o_req_ndn = be->be_nsuffix[0]; |
ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op ); |
op->ors_scope = LDAP_SCOPE_SUBTREE; |
ldap_pvt_thread_join( tid, NULL ); |
ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op ); |
} else if ( SLAP_SYNC_SHADOW( op->o_bd )) { |
ldap_pvt_thread_join( tid, NULL ); |
/* If we're also a consumer, and we didn't find the context entry, |
} |
* then don't generate anything, wait for our provider to send it |
|
* to us. |
|
*/ |
|
goto out; |
|
} |
} |
|
|
if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) { |
if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) { |
slap_get_csn( op, si->si_ctxcsnbuf, sizeof(si->si_ctxcsnbuf), |
if ( SLAP_SYNC_SHADOW( op->o_bd )) { |
&si->si_ctxcsn, 0 ); |
/* If we're also a consumer, and we didn't get a contextCSN, |
|
* then don't generate anything, wait for our provider to send it |
|
* to us. |
|
*/ |
|
goto out; |
|
} |
|
si->si_ctxcsn.bv_len = sizeof( si->si_ctxcsnbuf ); |
|
slap_get_csn( op, &si->si_ctxcsn, 0 ); |
} |
} |
|
|
/* If our ctxcsn is different from what was read from the root |
/* If our ctxcsn is different from what was read from the root |
Line 2306 syncprov_db_close(
|
Line 2437 syncprov_db_close(
|
} |
} |
if ( si->si_numops ) { |
if ( si->si_numops ) { |
Connection conn; |
Connection conn; |
char opbuf[OPERATION_BUFFER_SIZE]; |
OperationBuffer opbuf; |
Operation *op = (Operation *)opbuf; |
Operation *op = (Operation *) &opbuf; |
SlapReply rs = {REP_RESULT}; |
SlapReply rs = {REP_RESULT}; |
void *thrctx; |
void *thrctx; |
|
|
Line 2358 syncprov_db_destroy(
|
Line 2489 syncprov_db_destroy(
|
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
|
|
if ( si ) { |
if ( si ) { |
|
if ( si->si_logs ) { |
|
slog_entry *se = si->si_logs->sl_head; |
|
|
|
while ( se ) { |
|
slog_entry *se_next = se->se_next; |
|
ch_free( se ); |
|
se = se_next; |
|
} |
|
|
|
ch_free( si->si_logs ); |
|
} |
ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex ); |
ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex ); |
ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex ); |
ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex ); |
ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex ); |
ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex ); |
Line 2434 static int syncprov_parseCtrl (
|
Line 2576 static int syncprov_parseCtrl (
|
rs->sr_text = "Sync control : cookie decoding error"; |
rs->sr_text = "Sync control : cookie decoding error"; |
return LDAP_PROTOCOL_ERROR; |
return LDAP_PROTOCOL_ERROR; |
} |
} |
|
tag = ber_peek_tag( ber, &len ); |
} |
} |
if ( tag == LDAP_TAG_RELOAD_HINT ) { |
if ( tag == LDAP_TAG_RELOAD_HINT ) { |
if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) { |
if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) { |
Line 2475 static int syncprov_parseCtrl (
|
Line 2618 static int syncprov_parseCtrl (
|
static slap_overinst syncprov; |
static slap_overinst syncprov; |
|
|
int |
int |
syncprov_init() |
syncprov_initialize() |
{ |
{ |
int rc; |
int rc; |
|
|
rc = register_supported_control( LDAP_CONTROL_SYNC, |
rc = register_supported_control( LDAP_CONTROL_SYNC, |
SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL, |
SLAP_CTRL_SEARCH, NULL, |
syncprov_parseCtrl, &slap_cids.sc_LDAPsync ); |
syncprov_parseCtrl, &slap_cids.sc_LDAPsync ); |
if ( rc != LDAP_SUCCESS ) { |
if ( rc != LDAP_SUCCESS ) { |
Debug( LDAP_DEBUG_ANY, |
Debug( LDAP_DEBUG_ANY, |
Line 2508 syncprov_init()
|
Line 2651 syncprov_init()
|
|
|
syncprov.on_bi.bi_cf_ocs = spocs; |
syncprov.on_bi.bi_cf_ocs = spocs; |
|
|
|
generic_filter.f_desc = slap_schema.si_ad_objectClass; |
|
|
rc = config_register_schema( spcfg, spocs ); |
rc = config_register_schema( spcfg, spocs ); |
if ( rc ) return rc; |
if ( rc ) return rc; |
|
|
Line 2518 syncprov_init()
|
Line 2663 syncprov_init()
|
int |
int |
init_module( int argc, char *argv[] ) |
init_module( int argc, char *argv[] ) |
{ |
{ |
return syncprov_init(); |
return syncprov_initialize(); |
} |
} |
#endif /* SLAPD_OVER_SYNCPROV == SLAPD_MOD_DYNAMIC */ |
#endif /* SLAPD_OVER_SYNCPROV == SLAPD_MOD_DYNAMIC */ |
|
|