--- servers/slapd/overlays/syncprov.c 2005/10/14 22:31:22 1.119 +++ servers/slapd/overlays/syncprov.c 2005/11/15 17:27:40 1.125 @@ -1,4 +1,4 @@ -/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.118 2005/10/13 09:58:46 hyc Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.124 2005/11/07 23:40:20 ando Exp $ */ /* syncprov.c - syncrepl provider */ /* This work is part of OpenLDAP Software . * @@ -383,6 +383,9 @@ findbase_cb( Operation *op, SlapReply *r return LDAP_SUCCESS; } +static Filter generic_filter = { LDAP_FILTER_PRESENT, { 0 }, NULL }; +static struct berval generic_filterstr = BER_BVC("(objectclass=*)"); + static int syncprov_findbase( Operation *op, fbase_cookie *fc ) { @@ -422,6 +425,8 @@ syncprov_findbase( Operation *op, fbase_ fop.ors_tlimit = SLAP_NO_LIMIT; fop.ors_attrs = slap_anlist_no_attrs; fop.ors_attrsonly = 1; + fop.ors_filter = &generic_filter; + fop.ors_filterstr = generic_filterstr; fop.o_bd->bd_info = on->on_info->oi_orig; rc = fop.o_bd->be_search( &fop, &frs ); @@ -478,9 +483,11 @@ syncprov_findbase( Operation *op, fbase_ * CSN, and generate Present records for them. We always collect this result * in SyncID sets, even if there's only one match. */ -#define FIND_MAXCSN 1 -#define FIND_CSN 2 -#define FIND_PRESENT 3 +typedef enum find_csn_t { + FIND_MAXCSN = 1, + FIND_CSN = 2, + FIND_PRESENT = 3 +} find_csn_t; static int findmax_cb( Operation *op, SlapReply *rs ) @@ -559,7 +566,7 @@ findpres_cb( Operation *op, SlapReply *r } 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; syncprov_info_t *si = on->on_bi.bi_private; @@ -729,7 +736,8 @@ syncprov_free_syncop( syncops *so ) /* Send a persistent search response */ 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; @@ -1214,9 +1222,9 @@ syncprov_checkpoint( Operation *op, Slap syncprov_info_t *si = on->on_bi.bi_private; Modifications mod; Operation opm; + SlapReply rsm; struct berval bv[2]; slap_callback cb = {0}; - int manage = get_manageDSAit(op); mod.sml_values = bv; bv[1].bv_val = NULL; @@ -1236,8 +1244,10 @@ syncprov_checkpoint( Operation *op, Slap opm.o_req_ndn = op->o_bd->be_nsuffix[0]; opm.o_bd->bd_info = on->on_info->oi_orig; opm.o_managedsait = SLAP_CONTROL_NONCRITICAL; - opm.o_bd->be_modify( &opm, rs ); - opm.o_managedsait = manage; + opm.o_bd->be_modify( &opm, &rsm ); + if ( mod.sml_next != NULL ) { + slap_mods_free( mod.sml_next, 1 ); + } } static void @@ -2139,6 +2149,13 @@ sp_cf_gen(ConfigArgs *c) rc = 1; } break; + case SP_USEHINT: + if ( si->si_usehint ) { + c->value_int = 1; + } else { + rc = 1; + } + break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { @@ -2159,6 +2176,12 @@ sp_cf_gen(ConfigArgs *c) else rc = LDAP_NO_SUCH_ATTRIBUTE; break; + case SP_USEHINT: + if ( si->si_usehint ) + si->si_usehint = 0; + else + rc = LDAP_NO_SUCH_ATTRIBUTE; + break; } return rc; } @@ -2193,6 +2216,9 @@ sp_cf_gen(ConfigArgs *c) case SP_NOPRES: si->si_nopres = c->value_int; break; + case SP_USEHINT: + si->si_usehint = c->value_int; + break; } return rc; } @@ -2440,6 +2466,7 @@ static int syncprov_parseCtrl ( rs->sr_text = "Sync control : cookie decoding error"; return LDAP_PROTOCOL_ERROR; } + tag = ber_peek_tag( ber, &len ); } if ( tag == LDAP_TAG_RELOAD_HINT ) { if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) { @@ -2514,6 +2541,8 @@ syncprov_init() syncprov.on_bi.bi_cf_ocs = spocs; + generic_filter.f_desc = slap_schema.si_ad_objectClass; + rc = config_register_schema( spcfg, spocs ); if ( rc ) return rc;