]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
ITS#2864 don't use sl_mark/release.
[openldap] / servers / slapd / config.c
index 881e42882319d24f443291bf7878aee52e224847..cbfc9482ca0ad0b4017b9da8197eba52b976bc05 100644 (file)
@@ -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 <http://www.openldap.org/>.
+ *
+ * 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
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* 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"
@@ -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
@@ -2807,15 +2816,55 @@ add_syncrepl(
        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
@@ -2831,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"
@@ -2898,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 )) {