X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=cbfc9482ca0ad0b4017b9da8197eba52b976bc05;hb=3d522a0c9fd79b0275a219bde1f4465b181a9318;hp=ea3d1a65f47a4c9d40b3b5666a8a3df6e084860b;hpb=279760a4674c26b8d6b6a843c2fd20e630e3c7d6;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index ea3d1a65f4..cbfc9482ca 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -1,8 +1,27 @@ /* config.c - configuration file handling routines */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1995 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. */ #include "portable.h" @@ -1939,7 +1958,7 @@ read_config( const char *fname, int depth ) } } - /* dn of master entity allowed to write to replica */ + /* dn of slave entity allowed to write to replica */ } else if ( strcasecmp( cargv[0], "updatedn" ) == 0 ) { if ( cargc < 2 ) { #ifdef NEW_LOGGING @@ -2755,21 +2774,11 @@ add_syncrepl( ) { syncinfo_t *si; + syncinfo_t *si_entry; + int rc = 0; + int duplicated_replica_id = 0; - if ( be->be_syncinfo ) { -#ifdef NEW_LOGGING - LDAP_LOG( CONFIG, INFO, - "add_syncrepl: multiple syncrepl lines in a database " - "definition are yet to be supported.\n", 0, 0, 0 ); -#else - Debug( LDAP_DEBUG_ANY, - "add_syncrepl: multiple syncrepl lines in a database " - "definition are yet to be supported.\n", 0, 0, 0 ); -#endif - return 1; - } - - si = be->be_syncinfo = (syncinfo_t *) ch_calloc( 1, sizeof( syncinfo_t ) ); + si = (syncinfo_t *) ch_calloc( 1, sizeof( syncinfo_t ) ); if ( si == NULL ) { #ifdef NEW_LOGGING @@ -2788,9 +2797,7 @@ add_syncrepl( si->si_schemachecking = 0; ber_str2bv( "(objectclass=*)", sizeof("(objectclass=*)")-1, 0, &si->si_filterstr ); - if ( be->be_suffix && be->be_suffix[0].bv_val ) { - ber_dupbv( &si->si_base, &be->be_nsuffix[0] ); - } + si->si_base.bv_val = NULL; si->si_scope = LDAP_SCOPE_SUBTREE; si->si_attrsonly = 0; si->si_attrs = (char **) ch_calloc( 1, sizeof( char * )); @@ -2805,20 +2812,59 @@ 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 ); - if ( parse_syncrepl_line( cargv, cargc, si ) < 0 ) { + rc = parse_syncrepl_line( cargv, cargc, si ); + + LDAP_STAILQ_FOREACH( si_entry, &be->be_syncinfo, si_next ) { + if ( si->si_rid == si_entry->si_rid ) { +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, ERR, + "add_syncrepl: duplicaetd replica id\n", 0, 0,0 ); +#else + Debug( LDAP_DEBUG_ANY, + "add_syncrepl: duplicated replica id\n",0, 0, 0 ); +#endif + duplicated_replica_id = 1; + break; + } + } + + if ( rc < 0 || duplicated_replica_id ) { + syncinfo_t *si_entry; /* Something bad happened - back out */ #ifdef NEW_LOGGING LDAP_LOG( CONFIG, ERR, "failed to add syncinfo\n", 0, 0,0 ); #else Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 ); #endif - free( si ); - be->be_syncinfo = NULL; + + /* If error, remove all syncinfo */ + LDAP_STAILQ_FOREACH( si_entry, &be->be_syncinfo, si_next ) { + if ( si_entry->si_updatedn.bv_val ) { + ch_free( si->si_updatedn.bv_val ); + } + if ( si_entry->si_filterstr.bv_val ) { + ch_free( si->si_filterstr.bv_val ); + } + if ( si_entry->si_attrs ) { + int i = 0; + while ( si_entry->si_attrs[i] != NULL ) { + ch_free( si_entry->si_attrs[i] ); + i++; + } + ch_free( si_entry->si_attrs ); + } + } + + while ( !LDAP_STAILQ_EMPTY( &be->be_syncinfo )) { + si_entry = LDAP_STAILQ_FIRST( &be->be_syncinfo ); + LDAP_STAILQ_REMOVE_HEAD( &be->be_syncinfo, si_next ); + ch_free( si_entry ); + } + LDAP_STAILQ_INIT( &be->be_syncinfo ); return 1; } else { #ifdef NEW_LOGGING @@ -2834,11 +2880,12 @@ add_syncrepl( be->be_flags |= SLAP_BFLAG_NO_SCHEMA_CHECK; } si->si_be = be; + LDAP_STAILQ_INSERT_TAIL( &be->be_syncinfo, si, si_next ); return 0; } } -#define IDSTR "id" +#define IDSTR "rid" #define PROVIDERSTR "provider" #define SUFFIXSTR "suffix" #define UPDATEDNSTR "updatedn" @@ -2901,7 +2948,7 @@ parse_syncrepl_line( "syncrepl id %d is out of range [0..999]\n", tmp ); return -1; } - si->si_id = tmp; + si->si_rid = tmp; gots |= GOT_ID; } else if ( !strncasecmp( cargv[ i ], PROVIDERSTR, sizeof( PROVIDERSTR ) - 1 )) { @@ -3004,7 +3051,9 @@ parse_syncrepl_line( { struct berval bv; val = cargv[ i ] + sizeof( SEARCHBASESTR ); - ch_free( si->si_base.bv_val ); + if ( si->si_base.bv_val ) { + ch_free( si->si_base.bv_val ); + } ber_str2bv( val, 0, 0, &bv ); if ( dnNormalize( 0, NULL, NULL, &bv, &si->si_base, NULL )) { fprintf( stderr, "Invalid base DN \"%s\"\n", val );