]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/repl.c
Add a sample ACL
[openldap] / servers / slapd / repl.c
index 443fe81d932f6565172d24fcdadc6970ff4cd245..2dc8344f8ef39468b8ae34473c2bc7444f75d6d6 100644 (file)
 #endif
 
 #include "slap.h"
+#include "ldif.h"
 
+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 + 1 ] = NULL;
+
+       return( i );
+}
 
 void
 replog(
@@ -34,6 +60,10 @@ replog(
        char *tmp;
        FILE    *fp, *lfp;
        int     len, i;
+/* undef NO_LOG_WHEN_NO_REPLICAS */
+#ifdef NO_LOG_WHEN_NO_REPLICAS
+       int     count = 0;
+#endif
 
        if ( be->be_replogfile == NULL && replogfile == NULL ) {
                return;
@@ -46,14 +76,61 @@ replog(
                return;
        }
 
+       tmp = ch_strdup( dn );
+       if ( dn_normalize( tmp ) == NULL ) {
+               /* something has gone really bad */
+               ch_free( tmp );
+
+               lock_fclose( fp, lfp );
+               ldap_pvt_thread_mutex_unlock( &replog_mutex );
+               return;
+       }
+
        for ( i = 0; be->be_replica != NULL && be->be_replica[i] != NULL;
            i++ ) {
-               fprintf( fp, "replica: %s\n", be->be_replica[i] );
+               /* check if dn's suffix matches legal suffixes, if any */
+               if ( be->be_replica[i]->ri_nsuffix != NULL ) {
+                       int j;
+
+                       for ( j = 0; be->be_replica[i]->ri_nsuffix[j]; j++ ) {
+                               if ( dn_issuffix( tmp, be->be_replica[i]->ri_nsuffix[j] ) ) {
+                                       break;
+                               }
+                       }
+
+                       if ( !be->be_replica[i]->ri_nsuffix[j] ) {
+                               /* do not add "replica:" line */
+                               continue;
+                       }
+               }
+
+               fprintf( fp, "replica: %s\n", be->be_replica[i]->ri_host );
+#ifdef NO_LOG_WHEN_NO_REPLICAS
+               ++count;
+#endif
+       }
+
+       ch_free( tmp );
+#ifdef NO_LOG_WHEN_NO_REPLICAS
+       if ( count == 0 ) {
+               /* if no replicas matched, drop the log 
+                * (should we log it anyway?) */
+               lock_fclose( fp, lfp );
+               ldap_pvt_thread_mutex_unlock( &replog_mutex );
+
+               return;
        }
+#endif
+
        fprintf( fp, "time: %ld\n", (long) slap_get_time() );
        fprintf( fp, "dn: %s\n", dn );
 
        switch ( op->o_tag ) {
+       case LDAP_REQ_EXTENDED:
+               /* quick hack for extended operations */
+               /* assume change parameter is a Modfications* */
+               /* fall thru */
+
        case LDAP_REQ_MODIFY:
                fprintf( fp, "changetype: modify\n" );
                ml = change;