+int
+add_replica_info(
+ Backend *be,
+ const char *host
+)
+{
+ int i = 0;
+
+ assert( be );
+ assert( host );
+
+ if ( be->be_replica != NULL ) {
+ for ( ; be->be_replica[ i ] != NULL; i++ );
+ }
+
+ be->be_replica = ch_realloc( be->be_replica,
+ sizeof( struct slap_replica_info * )*( i + 2 ) );
+
+ be->be_replica[ i ]
+ = ch_calloc( sizeof( struct slap_replica_info ), 1 );
+ be->be_replica[ i ]->ri_host = ch_strdup( host );
+ be->be_replica[ i ]->ri_nsuffix = NULL;
+ be->be_replica[ i ]->ri_attrs = NULL;
+ be->be_replica[ i + 1 ] = NULL;
+
+ return( i );
+}
+
+int
+add_replica_suffix(
+ Backend *be,
+ int nr,
+ const char *suffix
+)
+{
+ struct berval dn, ndn;
+ int rc;
+
+ dn.bv_val = (char *) suffix;
+ dn.bv_len = strlen( dn.bv_val );
+
+ rc = dnNormalize2( NULL, &dn, &ndn );
+ if( rc != LDAP_SUCCESS ) {
+ return 2;
+ }
+
+ if ( select_backend( &ndn, 0, 0 ) != be ) {
+ free( ndn.bv_val );
+ return 1;
+ }
+
+ ber_bvarray_add( &be->be_replica[nr]->ri_nsuffix, &ndn );
+ return 0;
+}
+
+int
+add_replica_attrs(
+ Backend *be,
+ int nr,
+ char *attrs,
+ int exclude
+)
+{
+ if ( be->be_replica[nr]->ri_attrs != NULL ) {
+ if ( be->be_replica[nr]->ri_exclude != exclude ) {
+ fprintf( stderr, "attr selective replication directive '%s' conflicts with previous one (discarded)\n", attrs );
+ ch_free( be->be_replica[nr]->ri_attrs );
+ be->be_replica[nr]->ri_attrs = NULL;
+ }
+ }
+
+ be->be_replica[nr]->ri_exclude = exclude;
+ be->be_replica[nr]->ri_attrs = str2anlist( be->be_replica[nr]->ri_attrs,
+ attrs, "," );
+ return ( be->be_replica[nr]->ri_attrs == NULL );
+}
+
+static void
+print_vals( FILE *fp, struct berval *type, struct berval *bv );
+static void
+replog1( struct slap_replica_info *ri, Operation *op, void *change, FILE *fp, void *first);