X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=cbfc9482ca0ad0b4017b9da8197eba52b976bc05;hb=3d522a0c9fd79b0275a219bde1f4465b181a9318;hp=3245fe986cb09755784acd2cfa74ae9f2ed463bc;hpb=01f7a7466bf70b552b69d6f46380ee139fbfa529;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 3245fe986c..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,35 +2797,74 @@ 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 * )); si->si_attrs[0] = NULL; si->si_type = LDAP_SYNC_REFRESH_ONLY; si->si_interval = 86400; - si->si_syncCookie = NULL; + si->si_syncCookie.ctxcsn = NULL; + si->si_syncCookie.octet_str = NULL; + si->si_syncCookie.sid = -1; si->si_manageDSAit = 0; si->si_tlimit = -1; si->si_slimit = -1; - si->si_syncUUID = NULL; - si->si_syncUUID_ndn = NULL; - si->si_sync_mode = LDAP_SYNC_STATE_MODE; + si->si_syncUUID_ndn.bv_val = NULL; + si->si_syncUUID_ndn.bv_len = 0; 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 @@ -2832,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" @@ -2863,7 +2912,6 @@ add_syncrepl( #define ATTRSONLYSTR "attrsonly" #define TYPESTR "type" #define INTERVALSTR "interval" -#define COOKIESTR "cookie" #define LASTMODSTR "lastmod" #define LMREQSTR "req" #define LMGENSTR "gen" @@ -2900,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 )) { @@ -3003,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 ); @@ -3052,43 +3102,61 @@ parse_syncrepl_line( } else if ( !strncasecmp( cargv[ i ], INTERVALSTR, sizeof( INTERVALSTR ) - 1 ) ) { - char *hstr; - char *mstr; - char *dstr; val = cargv[ i ] + sizeof( INTERVALSTR ); - dstr = val; - hstr = strchr( dstr, ':' ); - if ( hstr == NULL ) { - fprintf( stderr, "Error: parse_syncrepl_line: " - "invalid interval \"%s\"\n", val ); - return 1; - } - *hstr++ = '\0'; - mstr = strchr( hstr, ':' ); - if ( mstr == NULL ) { - fprintf( stderr, "Error: parse_syncrepl_line: " - "invalid interval \"%s\"\n", val ); - return 1; + if ( si->si_type == LDAP_SYNC_REFRESH_AND_PERSIST ) { + si->si_interval = 0; + } else { + char *hstr; + char *mstr; + char *dstr; + char *sstr; + int dd, hh, mm, ss; + dstr = val; + hstr = strchr( dstr, ':' ); + if ( hstr == NULL ) { + fprintf( stderr, "Error: parse_syncrepl_line: " + "invalid interval \"%s\"\n", val ); + return 1; + } + *hstr++ = '\0'; + mstr = strchr( hstr, ':' ); + if ( mstr == NULL ) { + fprintf( stderr, "Error: parse_syncrepl_line: " + "invalid interval \"%s\"\n", val ); + return 1; + } + *mstr++ = '\0'; + sstr = strchr( mstr, ':' ); + if ( sstr == NULL ) { + fprintf( stderr, "Error: parse_syncrepl_line: " + "invalid interval \"%s\"\n", val ); + return 1; + } + *sstr++ = '\0'; + + dd = atoi( dstr ); + hh = atoi( hstr ); + mm = atoi( mstr ); + ss = atoi( sstr ); + if (( hh > 24 ) || ( hh < 0 ) || + ( mm > 60 ) || ( mm < 0 ) || + ( ss > 60 ) || ( ss < 0 ) || ( dd < 0 )) { + fprintf( stderr, "Error: parse_syncrepl_line: " + "invalid interval \"%s\"\n", val ); + return 1; + } + si->si_interval = (( dd * 24 + hh ) * 60 + mm ) * 60 + ss; } - *mstr++ = '\0'; - si->si_interval = (( atoi( dstr ) * 24 + atoi( hstr )) * 60 - + atoi( mstr )) * 60; - if ( si->si_interval < 0 ) { fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%ld\"\n", (long) si->si_interval); return 1; } - } else if ( !strncasecmp( cargv[ i ], - COOKIESTR, sizeof( COOKIESTR ) - 1 ) ) - { - val = cargv[ i ] + sizeof( COOKIESTR ); - si->si_syncCookie = ber_str2bv( val, strlen( val ), 1, NULL ); } else if ( !strncasecmp( cargv[ i ], MANAGEDSAITSTR, sizeof( MANAGEDSAITSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( COOKIESTR ); + val = cargv[ i ] + sizeof( MANAGEDSAITSTR ); si->si_manageDSAit = atoi( val ); } else if ( !strncasecmp( cargv[ i ], SLIMITSTR, sizeof( SLIMITSTR ) - 1 ) )