typedef struct syncinfo_s {
struct syncinfo_s *si_next;
- struct slap_backend_db *si_be;
- struct slap_backend_db *si_wbe;
- struct re_s *si_re;
- int si_rid;
- char si_ridtxt[8];
+ BackendDB *si_be;
+ BackendDB *si_wbe;
+ struct re_s *si_re;
+ int si_rid;
+ char si_ridtxt[8];
slap_bindconf si_bindconf;
struct berval si_base;
struct berval si_logbase;
struct berval si_filterstr;
struct berval si_logfilterstr;
- int si_scope;
- int si_attrsonly;
- char *si_anfile;
+ int si_scope;
+ int si_attrsonly;
+ char *si_anfile;
AttributeName *si_anlist;
AttributeName *si_exanlist;
- char **si_attrs;
- char **si_exattrs;
- int si_allattrs;
- int si_allopattrs;
- int si_schemachecking;
- int si_type; /* the active type */
- int si_ctype; /* the configured type */
- time_t si_interval;
- time_t *si_retryinterval;
- int *si_retrynum_init;
- int *si_retrynum;
+ char **si_attrs;
+ char **si_exattrs;
+ int si_allattrs;
+ int si_allopattrs;
+ int si_schemachecking;
+ int si_type; /* the active type */
+ int si_ctype; /* the configured type */
+ time_t si_interval;
+ time_t *si_retryinterval;
+ int *si_retrynum_init;
+ int *si_retrynum;
struct sync_cookie si_syncCookie;
cookie_state *si_cookieState;
- int si_cookieAge;
- int si_manageDSAit;
- int si_slimit;
- int si_tlimit;
- int si_refreshDelete;
- int si_refreshPresent;
- int si_syncdata;
- int si_logstate;
- int si_conn_setup;
- Avlnode *si_presentlist;
- LDAP *si_ld;
- LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;
+ int si_cookieAge;
+ int si_manageDSAit;
+ int si_slimit;
+ int si_tlimit;
+ int si_refreshDelete;
+ int si_refreshPresent;
+ int si_syncdata;
+ int si_logstate;
+ int si_conn_setup;
+ Avlnode *si_presentlist;
+ LDAP *si_ld;
+ LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;
ldap_pvt_thread_mutex_t si_mutex;
} syncinfo_t;
struct berval *, struct berval *, void * );
/* callback functions */
-static int dn_callback( struct slap_op *, struct slap_rep * );
-static int nonpresent_callback( struct slap_op *, struct slap_rep * );
-static int null_callback( struct slap_op *, struct slap_rep * );
+static int dn_callback( Operation *, SlapReply * );
+static int nonpresent_callback( Operation *, SlapReply * );
+static int null_callback( Operation *, SlapReply * );
static AttributeDescription *sync_descs[4];
si->si_cookieState->cs_vals = csn;
for (i=0; !BER_BVISNULL( &csn[i] ); i++);
si->si_cookieState->cs_num = i;
- si->si_cookieState->cs_sids = slap_parse_csn_sids( csn, i );
+ si->si_cookieState->cs_sids = slap_parse_csn_sids( csn, i, NULL );
}
}
if ( si->si_cookieState->cs_num ) {
si->si_cookieState->cs_num = num;
si->si_cookieState->cs_vals = a.a_vals;
si->si_cookieState->cs_sids = slap_parse_csn_sids( a.a_vals,
- num );
+ num, NULL );
si->si_cookieState->cs_age++;
} else {
ber_bvarray_free( a.a_vals );
}
ber_scanf( ber, /*"{"*/ "}" );
}
- if ( !syncCookie_req.ctxcsn ) {
+ if ( !syncCookie.ctxcsn ) {
+ match = 1;
+ } else if ( !syncCookie_req.ctxcsn ) {
match = -1;
m = 0;
- } else if ( !syncCookie.ctxcsn ) {
- match = 1;
} else {
match = compare_csns( &syncCookie_req, &syncCookie, &m );
}
continue;
}
- if ( !syncCookie_req.ctxcsn ) {
+ if ( !syncCookie.ctxcsn ) {
+ match = 1;
+ } else if ( !syncCookie_req.ctxcsn ) {
match = -1;
m = 0;
- } else if ( !syncCookie.ctxcsn ) {
- match = 1;
} else {
match = compare_csns( &syncCookie_req, &syncCookie, &m );
}
cs = be->be_syncinfo->si_cookieState;
for ( sip = &be->be_syncinfo; *sip != si; sip = &(*sip)->si_next );
*sip = si->si_next;
- syncinfo_free( si );
+ syncinfo_free( si, 0 );
if ( !be->be_syncinfo ) {
SLAP_DBFLAGS( be ) &= ~(SLAP_DBFLAG_SHADOW|SLAP_DBFLAG_SYNC_SHADOW);
if ( cs ) {
+ ch_free( cs->cs_sids );
ber_bvarray_free( cs->cs_vals );
ldap_pvt_thread_mutex_destroy( &cs->cs_mutex );
ch_free( cs );
op->orm_modlist = modlist;
op->o_bd = si->si_wbe;
rc = op->o_bd->be_modify( op, &rs );
+ modlist = op->orm_modlist;
Debug( rc ? LDAP_DEBUG_ANY : LDAP_DEBUG_SYNC,
"syncrepl_message_to_op: %s be_modify %s (%d)\n",
si->si_ridtxt, op->o_req_dn.bv_val, rc );
if ( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_DELETE ) {
/* NOTE: this could be done even before decoding the DN,
* although encoding errors wouldn't be detected */
- return LDAP_SUCCESS;
+ rc = LDAP_SUCCESS;
+ goto done;
}
if ( entry == NULL ) {
e = NULL;
}
}
- *entry = e;
+ if ( entry )
+ *entry = e;
return rc;
}
value_add( &si->si_cookieState->cs_vals, syncCookie->ctxcsn );
free( si->si_cookieState->cs_sids );
si->si_cookieState->cs_sids = slap_parse_csn_sids(
- si->si_cookieState->cs_vals, si->si_cookieState->cs_num );
+ si->si_cookieState->cs_vals, si->si_cookieState->cs_num, NULL );
}
si->si_cookieState->cs_age++;
}
void
-syncinfo_free( syncinfo_t *sie )
+syncinfo_free( syncinfo_t *sie, int free_all )
{
- if ( sie->si_ld ) {
- if ( sie->si_conn_setup ) {
- ber_socket_t s;
- ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s );
- connection_client_stop( s );
- sie->si_conn_setup = 0;
- }
- ldap_unbind_ext( sie->si_ld, NULL, NULL );
- }
+ syncinfo_t *si_next;
- /* re-fetch it, in case it was already removed */
- sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie );
- if ( sie->si_re ) {
- if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) )
- ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re );
- ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re );
+ if ( free_all && sie->si_cookieState ) {
+ ch_free( sie->si_cookieState->cs_sids );
+ ber_bvarray_free( sie->si_cookieState->cs_vals );
+ ldap_pvt_thread_mutex_destroy( &sie->si_cookieState->cs_mutex );
+ ch_free( sie->si_cookieState );
}
+ do {
+ si_next = sie->si_next;
- ldap_pvt_thread_mutex_destroy( &sie->si_mutex );
-
- bindconf_free( &sie->si_bindconf );
-
- if ( sie->si_filterstr.bv_val ) {
- ch_free( sie->si_filterstr.bv_val );
- }
- if ( sie->si_logfilterstr.bv_val ) {
- ch_free( sie->si_logfilterstr.bv_val );
- }
- if ( sie->si_base.bv_val ) {
- ch_free( sie->si_base.bv_val );
- }
- if ( sie->si_logbase.bv_val ) {
- ch_free( sie->si_logbase.bv_val );
- }
- if ( sie->si_attrs ) {
- int i = 0;
- while ( sie->si_attrs[i] != NULL ) {
- ch_free( sie->si_attrs[i] );
- i++;
+ if ( sie->si_ld ) {
+ if ( sie->si_conn_setup ) {
+ ber_socket_t s;
+ ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s );
+ connection_client_stop( s );
+ sie->si_conn_setup = 0;
+ }
+ ldap_unbind_ext( sie->si_ld, NULL, NULL );
}
- ch_free( sie->si_attrs );
- }
- if ( sie->si_exattrs ) {
- int i = 0;
- while ( sie->si_exattrs[i] != NULL ) {
- ch_free( sie->si_exattrs[i] );
- i++;
+
+ /* re-fetch it, in case it was already removed */
+ sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie );
+ if ( sie->si_re ) {
+ if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) )
+ ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re );
+ ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re );
}
- ch_free( sie->si_exattrs );
- }
- if ( sie->si_anlist ) {
- int i = 0;
- while ( sie->si_anlist[i].an_name.bv_val != NULL ) {
- ch_free( sie->si_anlist[i].an_name.bv_val );
- i++;
+
+ ldap_pvt_thread_mutex_destroy( &sie->si_mutex );
+
+ bindconf_free( &sie->si_bindconf );
+
+ if ( sie->si_filterstr.bv_val ) {
+ ch_free( sie->si_filterstr.bv_val );
}
- ch_free( sie->si_anlist );
- }
- if ( sie->si_exanlist ) {
- int i = 0;
- while ( sie->si_exanlist[i].an_name.bv_val != NULL ) {
- ch_free( sie->si_exanlist[i].an_name.bv_val );
- i++;
+ if ( sie->si_logfilterstr.bv_val ) {
+ ch_free( sie->si_logfilterstr.bv_val );
}
- ch_free( sie->si_exanlist );
- }
- if ( sie->si_retryinterval ) {
- ch_free( sie->si_retryinterval );
- }
- if ( sie->si_retrynum ) {
- ch_free( sie->si_retrynum );
- }
- if ( sie->si_retrynum_init ) {
- ch_free( sie->si_retrynum_init );
- }
- slap_sync_cookie_free( &sie->si_syncCookie, 0 );
- if ( sie->si_presentlist ) {
- avl_free( sie->si_presentlist, avl_ber_bvfree );
- }
- while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist ) ) {
- struct nonpresent_entry* npe;
- npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
- LDAP_LIST_REMOVE( npe, npe_link );
- if ( npe->npe_name ) {
- if ( npe->npe_name->bv_val ) {
- ch_free( npe->npe_name->bv_val );
+ if ( sie->si_base.bv_val ) {
+ ch_free( sie->si_base.bv_val );
+ }
+ if ( sie->si_logbase.bv_val ) {
+ ch_free( sie->si_logbase.bv_val );
+ }
+ if ( sie->si_attrs ) {
+ int i = 0;
+ while ( sie->si_attrs[i] != NULL ) {
+ ch_free( sie->si_attrs[i] );
+ i++;
}
- ch_free( npe->npe_name );
+ ch_free( sie->si_attrs );
}
- if ( npe->npe_nname ) {
- if ( npe->npe_nname->bv_val ) {
- ch_free( npe->npe_nname->bv_val );
+ if ( sie->si_exattrs ) {
+ int i = 0;
+ while ( sie->si_exattrs[i] != NULL ) {
+ ch_free( sie->si_exattrs[i] );
+ i++;
}
- ch_free( npe->npe_nname );
+ ch_free( sie->si_exattrs );
}
- ch_free( npe );
- }
- ch_free( sie );
+ if ( sie->si_anlist ) {
+ int i = 0;
+ while ( sie->si_anlist[i].an_name.bv_val != NULL ) {
+ ch_free( sie->si_anlist[i].an_name.bv_val );
+ i++;
+ }
+ ch_free( sie->si_anlist );
+ }
+ if ( sie->si_exanlist ) {
+ int i = 0;
+ while ( sie->si_exanlist[i].an_name.bv_val != NULL ) {
+ ch_free( sie->si_exanlist[i].an_name.bv_val );
+ i++;
+ }
+ ch_free( sie->si_exanlist );
+ }
+ if ( sie->si_retryinterval ) {
+ ch_free( sie->si_retryinterval );
+ }
+ if ( sie->si_retrynum ) {
+ ch_free( sie->si_retrynum );
+ }
+ if ( sie->si_retrynum_init ) {
+ ch_free( sie->si_retrynum_init );
+ }
+ slap_sync_cookie_free( &sie->si_syncCookie, 0 );
+ if ( sie->si_presentlist ) {
+ avl_free( sie->si_presentlist, avl_ber_bvfree );
+ }
+ while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist ) ) {
+ struct nonpresent_entry* npe;
+ npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
+ LDAP_LIST_REMOVE( npe, npe_link );
+ if ( npe->npe_name ) {
+ if ( npe->npe_name->bv_val ) {
+ ch_free( npe->npe_name->bv_val );
+ }
+ ch_free( npe->npe_name );
+ }
+ if ( npe->npe_nname ) {
+ if ( npe->npe_nname->bv_val ) {
+ ch_free( npe->npe_nname->bv_val );
+ }
+ ch_free( npe->npe_nname );
+ }
+ ch_free( npe );
+ }
+ ch_free( sie );
+ sie = si_next;
+ } while ( free_all && si_next );
}
Debug( LDAP_DEBUG_ANY,
"version %d incompatible with syncrepl\n",
si->si_bindconf.sb_version, 0, 0 );
- syncinfo_free( si );
+ syncinfo_free( si, 0 );
return 1;
}
#endif
if ( rc < 0 ) {
Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 );
- syncinfo_free( si );
+ syncinfo_free( si, 0 );
return 1;
} else {
Debug( LDAP_DEBUG_CONFIG,
si->si_bindconf.sb_version = LDAP_VERSION3;
ptr = buf;
- ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%03ld " PROVIDERSTR "=%s",
+ ptr += snprintf( ptr, WHATSLEFT, IDSTR "=%03d " PROVIDERSTR "=%s",
si->si_rid, si->si_bindconf.sb_uri.bv_val );
if ( ptr - buf >= sizeof( buf ) ) return;
if ( !BER_BVISNULL( &bc ) ) {
ldap_pvt_runqueue_isrunning( &slapd_rq, si->si_re ) ) {
si->si_ctype = 0;
} else {
- syncinfo_free( si );
+ syncinfo_free( si, 0 );
}
if ( i == c->valx )
break;