update ldapsync/syncrepl code according to the new version of

the protocol (draft-zeilenga-ldup-sync-04)
This commit is contained in:
Jong Hyuk Choi 2003-11-11 20:25:19 +00:00
parent 838c2d774e
commit f3586499d0
10 changed files with 277 additions and 196 deletions

View file

@ -206,10 +206,18 @@ typedef struct ldapcontrol {
#define LDAP_CONTROL_SYNC_DONE "1.3.6.1.4.1.4203.666.5.8"
#define LDAP_SYNC_INFO "1.3.6.1.4.1.4203.666.10.2"
#define LDAP_SYNC_NEW_COOKIE 0
#define LDAP_SYNC_STATE_MODE_DONE 1
#define LDAP_SYNC_LOG_MODE_DONE 2
#define LDAP_SYNC_REFRESH_DONE 3
#define LDAP_SYNC_REFRESH_PRESENTS 0
#define LDAP_SYNC_REFRESH_DELETES 1
#define LDAP_TAG_SYNC_NEW_COOKIE ((ber_tag_t) 0x80U)
#define LDAP_TAG_SYNC_REFRESH_DELETE ((ber_tag_t) 0xa1U)
#define LDAP_TAG_SYNC_REFRESH_PRESENT ((ber_tag_t) 0xa2U)
#define LDAP_TAG_SYNC_ID_SET ((ber_tag_t) 0xa3U)
#define LDAP_TAG_SYNC_COOKIE ((ber_tag_t) 0x04U)
#define LDAP_TAG_REFRESHDELETES ((ber_tag_t) 0x01U)
#define LDAP_TAG_REFRESHDONE ((ber_tag_t) 0x01U)
#define LDAP_TAG_RELOAD_HINT ((ber_tag_t) 0x01U)
#define LDAP_SYNC_STATE_MODE 0
#define LDAP_SYNC_LOG_MODE 1
@ -293,9 +301,6 @@ typedef struct ldapcontrol {
#define LDAP_TAG_SASL_RES_CREDS ((ber_tag_t) 0x87U) /* context specific + primitive */
#define LDAP_SYNC_TAG_COOKIE ((ber_tag_t) 0x04U) /* octet string */
/* possible operations a client can invoke */
#define LDAP_REQ_BIND ((ber_tag_t) 0x60U) /* application + constructed */
#define LDAP_REQ_UNBIND ((ber_tag_t) 0x42U) /* application + primitive */

View file

@ -548,15 +548,6 @@ int bdb_do_search(
);
#define bdb_psearch(op, rs, sop, e, ps_type) bdb_do_search(op, rs, sop, e, ps_type)
#define bdb_send_ldap_intermediate BDB_SYMBOL(send_ldap_intermediate)
int
bdb_send_ldap_intermediate(
Operation *op,
SlapReply *rs,
int state,
struct berval *cookie );
/*
* trans.c
*/

View file

@ -443,28 +443,20 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
if ( slog_found ) {
if ( ps_list->o_sync_slog_omitcsn.bv_len != 0 ) {
mr = slap_schema.si_ad_entryCSN->ad_type->sat_ordering;
if ( sop->o_sync_state.ctxcsn && sop->o_sync_state.ctxcsn->bv_val != NULL ) {
if ( sop->o_sync_state.ctxcsn &&
sop->o_sync_state.ctxcsn->bv_val != NULL ) {
value_match( &match, slap_schema.si_ad_entryCSN, mr,
SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
sop->o_sync_state.ctxcsn, &ps_list->o_sync_slog_omitcsn,
sop->o_sync_state.ctxcsn,
&ps_list->o_sync_slog_omitcsn,
&text );
} else {
match = -1;
}
if ( match >= 0 ) {
rs->sr_err = LDAP_SUCCESS;
rs->sr_rspoid = LDAP_SYNC_INFO;
rs->sr_ctrls = NULL;
bdb_send_ldap_intermediate( sop, rs,
LDAP_SYNC_STATE_MODE_DONE, NULL );
sync_send_present_mode = 0;
}
} else {
rs->sr_err = LDAP_SUCCESS;
rs->sr_rspoid = LDAP_SYNC_INFO;
rs->sr_ctrls = NULL;
bdb_send_ldap_intermediate( sop, rs,
LDAP_SYNC_STATE_MODE_DONE, NULL );
sync_send_present_mode = 0;
}
} else if ( sop->o_sync_slog_size >= 0 ) {
@ -1284,13 +1276,10 @@ id2entry_retry:
}
} else {
if ( sop->o_sync_mode & SLAP_SYNC_REFRESH ) {
struct berval cookie;
slap_compose_sync_cookie( sop, &cookie,
search_context_csn,
sop->o_sync_state.sid );
rs->sr_err = slap_build_sync_state_ctrl( sop,
rs, e, entry_sync_state, ctrls,
num_ctrls++, 0, &cookie );
num_ctrls++, 0, NULL );
if ( rs->sr_err != LDAP_SUCCESS ) goto done;
rs->sr_ctrls = ctrls;
@ -1306,8 +1295,6 @@ id2entry_retry:
}
}
if ( cookie.bv_val )
ch_free( cookie.bv_val );
ch_free( ctrls[num_ctrls-1]->ldctl_value.bv_val );
ch_free( ctrls[--num_ctrls] );
ctrls[num_ctrls] = NULL;
@ -1368,43 +1355,38 @@ nochange:
rs->sr_err = LDAP_SUCCESS;
rs->sr_rspoid = LDAP_SYNC_INFO;
rs->sr_ctrls = NULL;
if ( sync_send_present_mode ) {
struct berval cookie;
slap_compose_sync_cookie( sop, &cookie,
search_context_csn,
sop->o_sync_state.sid );
bdb_send_ldap_intermediate( sop, rs,
LDAP_SYNC_STATE_MODE_DONE, &cookie );
if ( cookie.bv_val )
ch_free( cookie.bv_val );
}
if ( !sync_send_present_mode && !no_sync_state_change ) {
int slog_found = 0;
ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
if ( ps_list->o_sync_slog_size > 0 ) {
if ( ps_list->o_sync_state.sid == sop->o_sync_state.sid ) {
slog_found = 1;
break;
}
}
}
if ( slog_found ) {
slap_send_session_log( op, ps_list, rs );
}
ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
}
if ( sop->o_sync_mode & SLAP_SYNC_PERSIST ) {
/* refreshAndPersist mode */
struct berval cookie;
slap_compose_sync_cookie( sop, &cookie,
search_context_csn,
sop->o_sync_state.sid );
bdb_send_ldap_intermediate( sop, rs,
LDAP_SYNC_LOG_MODE_DONE, &cookie );
if ( sync_send_present_mode ) {
slap_send_syncinfo( sop, rs,
LDAP_TAG_SYNC_REFRESH_PRESENT, &cookie, 1, NULL, 0 );
} else {
if ( !no_sync_state_change ) {
int slog_found = 0;
ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
if ( ps_list->o_sync_slog_size > 0 ) {
if ( ps_list->o_sync_state.sid == sop->o_sync_state.sid ) {
slog_found = 1;
break;
}
}
}
if ( slog_found ) {
slap_send_session_log( op, ps_list, rs );
}
ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
}
slap_send_syncinfo( sop, rs,
LDAP_TAG_SYNC_REFRESH_DELETE, &cookie, 1, NULL, 0 );
}
if ( cookie.bv_val ) {
ch_free( cookie.bv_val );
}
@ -1414,8 +1396,34 @@ nochange:
slap_compose_sync_cookie( sop, &cookie,
search_context_csn,
sop->o_sync_state.sid );
slap_build_sync_done_ctrl( sop, rs, ctrls,
num_ctrls++, 1, &cookie );
if ( sync_send_present_mode ) {
slap_build_sync_done_ctrl( sop, rs, ctrls,
num_ctrls++, 1, &cookie, LDAP_SYNC_REFRESH_PRESENTS );
} else {
if ( !no_sync_state_change ) {
int slog_found = 0;
ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list,
o_ps_link ) {
if ( ps_list->o_sync_slog_size > 0 ) {
if ( ps_list->o_sync_state.sid ==
sop->o_sync_state.sid ) {
slog_found = 1;
break;
}
}
}
if ( slog_found ) {
slap_send_session_log( op, ps_list, rs );
}
ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
}
slap_build_sync_done_ctrl( sop, rs, ctrls,
num_ctrls++, 1, &cookie, LDAP_SYNC_REFRESH_DELETES );
}
rs->sr_ctrls = ctrls;
rs->sr_ref = rs->sr_v2ref;
rs->sr_err = (rs->sr_v2ref == NULL) ? LDAP_SUCCESS : LDAP_REFERRAL;
@ -1732,48 +1740,3 @@ done:
(void) ber_free_buf( ber );
}
#endif
int
bdb_send_ldap_intermediate(
Operation *op,
SlapReply *rs,
int state,
struct berval *cookie )
{
BerElementBuffer berbuf;
BerElement *ber = (BerElement *)&berbuf;
struct berval rspdata;
int ret;
ber_init2( ber, NULL, LBER_USE_DER );
if ( cookie == NULL ) {
ber_printf( ber, "{eN}", state );
} else {
ber_printf( ber, "{eON}", state, cookie );
}
ret = ber_flatten2( ber, &rspdata, 0 );
if ( ret < 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, RESULTS,
"bdb_send_ldap_intermediate: ber_flatten2 failed\n",
0, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"bdb_send_ldap_intermediate: ber_flatten2 failed\n",
0, 0, 0 );
#endif
send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
return ret;
}
rs->sr_rspdata = &rspdata;
send_ldap_intermediate( op, rs );
rs->sr_rspdata = NULL;
ber_free_buf( ber );
return LDAP_SUCCESS;
}

View file

@ -2805,7 +2805,6 @@ add_syncrepl(
si->si_slimit = -1;
si->si_syncUUID_ndn.bv_val = NULL;
si->si_syncUUID_ndn.bv_len = 0;
si->si_sync_mode = LDAP_SYNC_STATE_MODE;
si->si_presentlist = NULL;
LDAP_LIST_INIT( &si->si_nonpresentlist );

View file

@ -1255,20 +1255,25 @@ static int parseLDAPsync (
tag = ber_peek_tag( ber, &len );
if ( tag == LDAP_SYNC_TAG_COOKIE ) {
if ( tag == LDAP_TAG_SYNC_COOKIE ) {
struct berval tmp_bv;
if (( ber_scanf( ber, /*{*/ "o}", &tmp_bv )) == LBER_ERROR ) {
if (( ber_scanf( ber, /*{*/ "o", &tmp_bv )) == LBER_ERROR ) {
rs->sr_text = "LDAP Sync control : cookie decoding error";
return LDAP_PROTOCOL_ERROR;
}
ber_bvarray_add( &op->o_sync_state.octet_str, &tmp_bv );
slap_parse_sync_cookie( &op->o_sync_state );
} else {
if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) {
rs->sr_text = "LDAP Sync control : decoding error";
}
if ( tag == LDAP_TAG_RELOAD_HINT ) {
if (( ber_scanf( ber, /*{*/ "b", &op->o_sync_rhint )) == LBER_ERROR ) {
rs->sr_text = "LDAP Sync control : rhint decoding error";
return LDAP_PROTOCOL_ERROR;
}
}
if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) {
rs->sr_text = "LDAP Sync control : decoding error";
return LDAP_PROTOCOL_ERROR;
}
(void) ber_free( ber, 1 );

View file

@ -45,7 +45,7 @@ slap_build_sync_state_ctrl(
LDAPControl **ctrls,
int num_ctrls,
int send_cookie,
struct berval *csn)
struct berval *cookie)
{
Attribute* a;
int ret;
@ -68,9 +68,9 @@ slap_build_sync_state_ctrl(
}
}
if ( send_cookie && csn ) {
if ( send_cookie && cookie ) {
ber_printf( ber, "{eOON}",
entry_sync_state, &entryuuid_bv, csn );
entry_sync_state, &entryuuid_bv, cookie );
} else {
ber_printf( ber, "{eON}",
entry_sync_state, &entryuuid_bv );
@ -107,9 +107,10 @@ slap_build_sync_done_ctrl(
Operation *op,
SlapReply *rs,
LDAPControl **ctrls,
int num_ctrls,
int send_cookie,
struct berval *csn )
int num_ctrls,
int send_cookie,
struct berval *cookie,
int refreshDeletes )
{
int ret;
BerElementBuffer berbuf;
@ -119,11 +120,14 @@ slap_build_sync_done_ctrl(
ctrls[num_ctrls] = ch_malloc ( sizeof ( LDAPControl ) );
if ( send_cookie && csn ) {
ber_printf( ber, "{ON}", csn );
} else {
ber_printf( ber, "{N}" );
ber_printf( ber, "{" );
if ( send_cookie && cookie ) {
ber_printf( ber, "O", cookie );
}
if ( refreshDeletes == LDAP_SYNC_REFRESH_DELETES ) {
ber_printf( ber, "b", refreshDeletes );
}
ber_printf( ber, "N}" );
ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_DONE;
ctrls[num_ctrls]->ldctl_iscritical = op->o_sync;
@ -158,7 +162,7 @@ slap_build_sync_state_ctrl_from_slog(
LDAPControl **ctrls,
int num_ctrls,
int send_cookie,
struct berval *csn)
struct berval *cookie)
{
Attribute* a;
int ret;
@ -176,9 +180,9 @@ slap_build_sync_state_ctrl_from_slog(
ber_dupbv( &entryuuid_bv, &slog_e->sl_uuid );
if ( send_cookie && csn ) {
if ( send_cookie && cookie ) {
ber_printf( ber, "{eOON}",
entry_sync_state, &entryuuid_bv, csn );
entry_sync_state, &entryuuid_bv, cookie );
} else {
ber_printf( ber, "{eON}",
entry_sync_state, &entryuuid_bv );
@ -210,6 +214,89 @@ slap_build_sync_state_ctrl_from_slog(
return LDAP_SUCCESS;
}
int
slap_send_syncinfo(
Operation *op,
SlapReply *rs,
int type,
struct berval *cookie,
int refreshDone,
BerVarray syncUUIDs,
int refreshDeletes )
{
BerElementBuffer berbuf;
BerElement *ber = (BerElement *)&berbuf;
struct berval rspdata;
int ret;
ber_init2( ber, NULL, LBER_USE_DER );
if ( type ) {
switch ( type ) {
case LDAP_TAG_SYNC_NEW_COOKIE:
ber_printf( ber, "tO", type, cookie );
break;
case LDAP_TAG_SYNC_REFRESH_DELETE:
case LDAP_TAG_SYNC_REFRESH_PRESENT:
ber_printf( ber, "t{", type );
if ( cookie ) {
ber_printf( ber, "O", cookie );
}
if ( refreshDone == 0 ) {
ber_printf( ber, "b", refreshDone );
}
ber_printf( ber, "N}" );
break;
case LDAP_TAG_SYNC_ID_SET:
ber_printf( ber, "t{", type );
if ( cookie ) {
ber_printf( ber, "O", cookie );
}
if ( refreshDeletes == 1 ) {
ber_printf( ber, "b", refreshDeletes );
}
ber_printf( ber, "[W]", syncUUIDs );
ber_printf( ber, "N}" );
break;
default:
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, RESULTS,
"slap_send_syncinfo: invalid syncinfo type (%d)\n",
type, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"slap_send_syncinfo: invalid syncinfo type (%d)\n",
type, 0, 0 );
#endif
return LDAP_OTHER;
}
}
ret = ber_flatten2( ber, &rspdata, 0 );
if ( ret < 0 ) {
#ifdef NEW_LOGGING
LDAP_LOG ( OPERATION, RESULTS,
"slap_send_syncinfo: ber_flatten2 failed\n",
0, 0, 0 );
#else
Debug( LDAP_DEBUG_TRACE,
"slap_send_syncinfo: ber_flatten2 failed\n",
0, 0, 0 );
#endif
send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
return ret;
}
rs->sr_rspdata = &rspdata;
send_ldap_intermediate( op, rs );
rs->sr_rspdata = NULL;
ber_free_buf( ber );
return LDAP_SUCCESS;
}
void
slap_compose_sync_cookie(
Operation *op,

View file

@ -584,10 +584,13 @@ LDAP_SLAPD_F (int) slap_build_sync_state_ctrl LDAP_P((
int, int, struct berval * ));
LDAP_SLAPD_F (int) slap_build_sync_done_ctrl LDAP_P((
Operation *, SlapReply *, LDAPControl **,
int, int, struct berval * ));
int, int, struct berval *, int ));
LDAP_SLAPD_F (int) slap_build_sync_state_ctrl_from_slog LDAP_P((
Operation *, SlapReply *, struct slog_entry *, int,
LDAPControl **, int, int, struct berval * ));
LDAP_SLAPD_F (int) slap_send_syncinfo LDAP_P((
Operation *, SlapReply *, int,
struct berval *, int, BerVarray, int ));
LDAP_SLAPD_F (void) slap_compose_sync_cookie LDAP_P((
Operation *, struct berval *, struct berval *, int ));
LDAP_SLAPD_F (void) slap_sync_cookie_free LDAP_P((
@ -1077,7 +1080,7 @@ LDAP_SLAPD_F (Entry*) syncrepl_message_to_entry LDAP_P((
LDAP_SLAPD_F (int) syncrepl_entry LDAP_P((
syncinfo_t *, Operation*, Entry*,
Modifications*,int, struct berval*,
struct sync_cookie *, int ));
struct sync_cookie * ));
LDAP_SLAPD_F (void) syncrepl_updateCookie LDAP_P((
syncinfo_t *, Operation *, struct berval *,
struct sync_cookie * ));

View file

@ -1303,10 +1303,7 @@ struct sync_cookie {
* syncinfo structure for syncrepl
*/
typedef struct syncinfo_s {
// struct slap_conn *si_conn;
struct slap_backend_db *si_be;
// struct slap_entry *si_e;
// void *si_ctx;
unsigned int si_id;
char *si_provideruri;
BerVarray si_provideruri_bv;
@ -1332,16 +1329,12 @@ typedef struct syncinfo_s {
char **si_attrs;
int si_type;
time_t si_interval;
// struct sync_cookie *si_syncCookie;
struct sync_cookie si_syncCookie;
int si_manageDSAit;
int si_slimit;
int si_tlimit;
// struct berval *si_syncUUID;
// struct berval *si_syncUUID_ndn;
struct berval si_syncUUID_ndn;
Avlnode *si_presentlist;
int si_sync_mode;
LDAP *si_ld;
LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;
} syncinfo_t;
@ -1998,6 +1991,7 @@ typedef struct slap_op {
#define SLAP_SYNC_PERSIST (0x2)
#define SLAP_SYNC_REFRESH_AND_PERSIST (0x3)
struct sync_cookie o_sync_state;
int o_sync_rhint;
struct berval o_sync_cid;
int o_sync_slog_size;
struct berval o_sync_csn;

View file

@ -50,6 +50,8 @@
static const struct berval slap_syncrepl_bvc = BER_BVC(SYNCREPL_STR);
static const struct berval slap_syncrepl_cn_bvc = BER_BVC(CN_STR SYNCREPL_STR);
static void avl_ber_bvfree( void * );
static void
syncrepl_del_nonpresent( Operation *, syncinfo_t * );
@ -191,8 +193,6 @@ do_syncrep1(
struct berval syncrepl_cn_bv;
struct sync_cookie syncCookie = { NULL, -1, NULL };
si->si_sync_mode = LDAP_SYNC_STATE_MODE;
/* Init connection to master */
rc = ldap_initialize( &si->si_ld, si->si_provideruri );
@ -380,7 +380,6 @@ do_syncrep2(
char *retoid = NULL;
struct berval *retdata = NULL;
int sync_info_arrived = 0;
Entry *entry = NULL;
int syncstate;
@ -392,7 +391,6 @@ do_syncrep2(
int rc;
int err;
ber_len_t len;
int syncinfo_arrived = 0;
slap_callback cb;
@ -407,6 +405,11 @@ do_syncrep2(
struct timeval *tout_p = NULL;
struct timeval tout = { 0, 0 };
int refreshDeletes = 0;
int refreshDone = 1;
BerVarray syncUUIDs;
ber_tag_t si_tag;
if ( slapd_abrupt_shutdown ) {
rc = -2;
goto done;
@ -452,7 +455,7 @@ do_syncrep2(
rctrlp = *rctrls;
ber_init2( ber, &rctrlp->ldctl_value, LBER_USE_DER );
ber_scanf( ber, "{em", &syncstate, &syncUUID );
if ( ber_peek_tag( ber, &len ) == LDAP_SYNC_TAG_COOKIE ) {
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE ) {
ber_scanf( ber, "m}", &cookie );
if ( cookie.bv_val ) {
struct berval tmp_bv;
@ -466,7 +469,7 @@ do_syncrep2(
entry = syncrepl_message_to_entry( si, op, msg,
&modlist, syncstate );
rc_efree = syncrepl_entry( si, op, entry, modlist, syncstate,
&syncUUID, &syncCookie_req, !syncinfo_arrived );
&syncUUID, &syncCookie_req );
if ( syncCookie.octet_str && syncCookie.octet_str[0].bv_val ) {
syncrepl_updateCookie( si, op, psub, &syncCookie );
}
@ -497,7 +500,7 @@ do_syncrep2(
ber_init2( ber, &rctrlp->ldctl_value, LBER_USE_DER );
ber_scanf( ber, "{" /*"}"*/);
if ( ber_peek_tag( ber, &len ) == LDAP_SYNC_TAG_COOKIE )
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE )
{
ber_scanf( ber, "m", &cookie );
if ( cookie.bv_val ) {
@ -509,6 +512,11 @@ do_syncrep2(
syncCookie.octet_str[0].bv_val )
slap_parse_sync_cookie( &syncCookie );
}
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_REFRESHDELETES )
{
ber_scanf( ber, "b", &refreshDeletes );
}
ber_scanf( ber, "}" );
}
if ( syncCookie_req.ctxcsn == NULL ) {
match = -1;
@ -532,10 +540,11 @@ do_syncrep2(
* 1) err code : LDAP_BUSY ...
* 2) on err policy : stop service, stop sync, retry
*/
if ( si->si_sync_mode == LDAP_SYNC_STATE_MODE && match
< 0 )
{
if ( refreshDeletes == 0 && match < 0 ) {
syncrepl_del_nonpresent( op, si );
} else {
avl_free( si->si_presentlist, avl_ber_bvfree );
si->si_presentlist = NULL;
}
}
rc = -2;
@ -546,21 +555,59 @@ do_syncrep2(
rc = ldap_parse_intermediate( si->si_ld, msg,
&retoid, &retdata, NULL, 0 );
if ( !rc && !strcmp( retoid, LDAP_SYNC_INFO ) ) {
sync_info_arrived = 1;
int si_refreshDelete = 0;
int si_refreshPresent = 0;
ber_init2( ber, retdata, LBER_USE_DER );
ber_scanf( ber, "{e" /*"}"*/, &syncstate );
if ( ber_peek_tag( ber, &len )
== LDAP_SYNC_TAG_COOKIE ) {
ber_scanf( ber, /*"{"*/ "m}", &cookie );
if ( cookie.bv_val ) {
struct berval tmp_bv;
ber_dupbv( &tmp_bv, &cookie );
ber_bvarray_add( &syncCookie.octet_str, &tmp_bv);
switch ( si_tag = ber_peek_tag( ber, &len )) {
ber_tag_t tag;
case LDAP_TAG_SYNC_NEW_COOKIE:
ber_scanf( ber, "tm", &tag, &cookie );
break;
case LDAP_TAG_SYNC_REFRESH_DELETE:
si_refreshDelete = 1;
case LDAP_TAG_SYNC_REFRESH_PRESENT:
si_refreshPresent = 1;
ber_scanf( ber, "t{", &tag );
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE )
{
ber_scanf( ber, "m", &tag, &cookie );
}
if ( syncCookie.octet_str &&
syncCookie.octet_str[0].bv_val )
slap_parse_sync_cookie( &syncCookie );
if ( ber_peek_tag( ber, &len ) ==
LDAP_TAG_REFRESHDONE )
{
ber_scanf( ber, "b", &refreshDone );
}
ber_scanf( ber, "}" );
break;
case LDAP_TAG_SYNC_ID_SET:
/* FIXME : to be supported */
ber_scanf( ber, "t{", &tag );
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE )
{
ber_scanf( ber, "m", &tag, &cookie );
}
if ( ber_peek_tag( ber, &len ) ==
LDAP_TAG_REFRESHDELETES )
{
ber_scanf( ber, "b", &refreshDeletes );
}
ber_scanf( ber, "[W]", &syncUUIDs );
ber_scanf( ber, "}" );
break;
default:
#ifdef NEW_LOGGING
LDAP_LOG( OPERATION, ERR,
"do_syncrep2 : unknown syncinfo tag (%d)\n",
si_tag, 0, 0 );
#else
Debug( LDAP_DEBUG_ANY,
"do_syncrep2 : unknown syncinfo tag (%d)\n",
si_tag, 0, 0 );
#endif
ldap_memfree( retoid );
ber_bvfree( retdata );
continue;
}
if ( syncCookie_req.ctxcsn == NULL ) {
@ -580,26 +627,11 @@ do_syncrep2(
syncrepl_updateCookie( si, op, psub, &syncCookie);
}
if ( syncstate == LDAP_SYNC_STATE_MODE_DONE ) {
if ( si_refreshPresent == 1 ) {
if ( match < 0 ) {
syncrepl_del_nonpresent( op, si );
}
si->si_sync_mode = LDAP_SYNC_LOG_MODE;
} else if ( syncstate == LDAP_SYNC_LOG_MODE_DONE ) {
si->si_sync_mode = LDAP_SYNC_PERSIST_MODE;
} else if ( syncstate == LDAP_SYNC_REFRESH_DONE ) {
si->si_sync_mode = LDAP_SYNC_PERSIST_MODE;
} else if ( syncstate != LDAP_SYNC_NEW_COOKIE ||
syncstate != LDAP_SYNC_LOG_MODE_DONE )
{
#ifdef NEW_LOGGING
LDAP_LOG( OPERATION, ERR,
"do_syncrep2 : unknown sync info\n", 0, 0, 0 );
#else
Debug( LDAP_DEBUG_ANY,
"do_syncrep2 : unknown sync info\n", 0, 0, 0 );
#endif
}
}
ldap_memfree( retoid );
ber_bvfree( retdata );
@ -944,8 +976,7 @@ syncrepl_entry(
Modifications* modlist,
int syncstate,
struct berval* syncUUID,
struct sync_cookie* syncCookie_req,
int refresh
struct sync_cookie* syncCookie_req
)
{
Backend *be = op->o_bd;
@ -959,8 +990,7 @@ syncrepl_entry(
int ret = LDAP_SUCCESS;
const char *text;
if ( refresh && si->si_sync_mode == LDAP_SYNC_STATE_MODE &&
( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_ADD ))
if (( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_ADD ))
{
syncuuid_bv = ber_dupbv( NULL, syncUUID );
avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv,
@ -1557,18 +1587,6 @@ done :
return;
}
void
avl_ber_bvfree( void *bv )
{
if( bv == NULL ) {
return;
}
if ( ((struct berval *)bv)->bv_val != NULL ) {
ch_free ( ((struct berval *)bv)->bv_val );
}
ch_free ( (char *) bv );
}
static int
dn_callback(
Operation* op,
@ -1694,3 +1712,16 @@ slap_create_syncrepl_entry(
return e;
}
static void
avl_ber_bvfree( void *bv )
{
if( bv == NULL ) {
return;
}
if ( ((struct berval *)bv)->bv_val != NULL ) {
ch_free ( ((struct berval *)bv)->bv_val );
}
ch_free ( (char *) bv );
}

View file

@ -1,6 +1,9 @@
#! /bin/sh
# $OpenLDAP$
echo "temporarily disabled"
exit 0
echo "running defines.sh"
. $SRCDIR/scripts/defines.sh