X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=56295fed6fdc5065683981a63f57682af6b3eaa1;hb=9c5fe98a79afc5303a1e82a93fd759532f289d27;hp=a8b343a9eccb902fffd96804609828ac9c426eaa;hpb=ac7404eabd46150a889b3a7d072c36aabea4c336;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index a8b343a9ec..56295fed6f 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" @@ -73,6 +92,10 @@ char *strtok_quote_ptr; int use_reverse_lookup = 0; +#ifdef LDAP_SLAPI +int slapi_plugins_used = 0; +#endif + static char *fp_getline(FILE *fp, int *lineno); static void fp_getline_init(int *lineno); static int fp_parse_line(int lineno, char *line); @@ -1639,13 +1662,11 @@ read_config( const char *fname, int depth ) #endif } -#ifdef SLAP_EXTENDED_SCHEMA } else if ( strcasecmp( cargv[0], "ditcontentrule" ) == 0 ) { char * p; p = strchr(saveline,'(' /*')'*/); rc = parse_cr( fname, lineno, p, cargv ); if( rc ) return rc; -#endif /* specify an attribute type */ } else if (( strcasecmp( cargv[0], "attributetype" ) == 0 ) @@ -1937,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 @@ -2406,6 +2427,7 @@ read_config( const char *fname, int depth ) != LDAP_SUCCESS ) { return( 1 ); } + slapi_plugins_used++; #else /* !defined( LDAP_SLAPI ) */ #ifdef NEW_LOGGING @@ -2448,45 +2470,57 @@ read_config( const char *fname, int depth ) /* pass anything else to the current backend info/db config routine */ } else { if ( bi != NULL ) { - if ( bi->bi_config == 0 ) { + if ( bi->bi_config ) { + rc = (*bi->bi_config)( bi, fname, lineno, cargc, cargv ); + + switch ( rc ) { + case 0: + break; + + case SLAP_CONF_UNKNOWN: #ifdef NEW_LOGGING - LDAP_LOG( CONFIG, INFO, - "%s: line %d: unknown directive \"%s\" inside " - "backend info definition (ignored).\n", - fname, lineno, cargv[0] ); + LDAP_LOG( CONFIG, INFO, + "%s: line %d: unknown directive \"%s\" inside " + "backend info definition (ignored).\n", + fname, lineno, cargv[0] ); #else - Debug( LDAP_DEBUG_ANY, + Debug( LDAP_DEBUG_ANY, "%s: line %d: unknown directive \"%s\" inside backend info definition (ignored)\n", - fname, lineno, cargv[0] ); + fname, lineno, cargv[0] ); #endif + break; - } else { - if ( (*bi->bi_config)( bi, fname, lineno, cargc, cargv ) - != 0 ) - { - return( 1 ); + default: + return 1; } } + } else if ( be != NULL ) { - if ( be->be_config == 0 ) { + if ( be->be_config ) { + rc = (*be->be_config)( be, fname, lineno, cargc, cargv ); + + switch ( rc ) { + case 0: + break; + + case SLAP_CONF_UNKNOWN: #ifdef NEW_LOGGING - LDAP_LOG( CONFIG, INFO, - "%s: line %d: uknown directive \"%s\" inside " - "backend database definition (ignored).\n", - fname, lineno, cargv[0] ); + LDAP_LOG( CONFIG, INFO, + "%s: line %d: unknown directive \"%s\" inside " + "backend database definition (ignored).\n", + fname, lineno, cargv[0] ); #else - Debug( LDAP_DEBUG_ANY, + Debug( LDAP_DEBUG_ANY, "%s: line %d: unknown directive \"%s\" inside backend database definition (ignored)\n", - fname, lineno, cargv[0] ); + fname, lineno, cargv[0] ); #endif + break; - } else { - if ( (*be->be_config)( be, fname, lineno, cargc, cargv ) - != 0 ) - { - return( 1 ); + default: + return 1; } } + } else { #ifdef NEW_LOGGING LDAP_LOG( CONFIG, INFO, @@ -2752,21 +2786,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 @@ -2785,35 +2809,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 @@ -2829,11 +2892,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" @@ -2860,7 +2924,6 @@ add_syncrepl( #define ATTRSONLYSTR "attrsonly" #define TYPESTR "type" #define INTERVALSTR "interval" -#define COOKIESTR "cookie" #define LASTMODSTR "lastmod" #define LMREQSTR "req" #define LMGENSTR "gen" @@ -2897,7 +2960,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 )) { @@ -3000,7 +3063,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 ); @@ -3049,43 +3114,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 ) )