]> git.sur5r.net Git - openldap/blob - servers/slapd/repl.c
39e4e7121843c750f05ed2169ce7d5dab5459a3d
[openldap] / servers / slapd / repl.c
1 /* repl.c - log modifications for replication purposes */
2 /*
3  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6
7 #include "portable.h"
8
9 #include <stdio.h>
10
11 #include <ac/string.h>
12 #include <ac/ctype.h>
13 #include <ac/socket.h>
14
15 #ifdef HAVE_SYS_FILE_H
16 #include <sys/file.h>
17 #endif
18
19 #include "slap.h"
20
21
22 void
23 replog(
24     Backend     *be,
25     Operation *op,
26     char        *dn,
27     void        *change
28 )
29 {
30         LDAPModList     *ml;
31         Entry   *e;
32         struct replog_moddn *moddn;
33         char *tmp;
34         FILE    *fp, *lfp;
35         int     len, i;
36
37         if ( be->be_replogfile == NULL && replogfile == NULL ) {
38                 return;
39         }
40
41         ldap_pvt_thread_mutex_lock( &replog_mutex );
42         if ( (fp = lock_fopen( be->be_replogfile ? be->be_replogfile :
43             replogfile, "a", &lfp )) == NULL ) {
44                 ldap_pvt_thread_mutex_unlock( &replog_mutex );
45                 return;
46         }
47
48         for ( i = 0; be->be_replica != NULL && be->be_replica[i] != NULL;
49             i++ ) {
50                 fprintf( fp, "replica: %s\n", be->be_replica[i] );
51         }
52         fprintf( fp, "time: %ld\n", (long) slap_get_time() );
53         fprintf( fp, "dn: %s\n", dn );
54
55         switch ( op->o_tag ) {
56         case LDAP_REQ_MODIFY:
57                 fprintf( fp, "changetype: modify\n" );
58                 ml = change;
59                 for ( ; ml != NULL; ml = ml->ml_next ) {
60                         switch ( ml->ml_op & ~LDAP_MOD_BVALUES ) {
61                         case LDAP_MOD_ADD:
62                                 fprintf( fp, "add: %s\n", ml->ml_type );
63                                 break;
64
65                         case LDAP_MOD_DELETE:
66                                 fprintf( fp, "delete: %s\n", ml->ml_type );
67                                 break;
68
69                         case LDAP_MOD_REPLACE:
70                                 fprintf( fp, "replace: %s\n", ml->ml_type );
71                                 break;
72                         }
73
74                         for ( i = 0; ml->ml_bvalues != NULL &&
75                             ml->ml_bvalues[i] != NULL; i++ ) {
76                                 char    *buf, *bufp;
77
78                                 len = strlen( ml->ml_type );
79                                 len = LDIF_SIZE_NEEDED( len,
80                                     ml->ml_bvalues[i]->bv_len ) + 1;
81                                 buf = (char *) ch_malloc( len );
82
83                                 bufp = buf;
84                                 ldif_sput( &bufp, LDIF_PUT_VALUE,
85                                         ml->ml_type,
86                                     ml->ml_bvalues[i]->bv_val,
87                                     ml->ml_bvalues[i]->bv_len );
88                                 *bufp = '\0';
89
90                                 fputs( buf, fp );
91
92                                 free( buf );
93                         }
94                         fprintf( fp, "-\n" );
95                 }
96                 break;
97
98         case LDAP_REQ_ADD:
99                 e = change;
100                 fprintf( fp, "changetype: add\n" );
101                 ldap_pvt_thread_mutex_lock( &entry2str_mutex );
102                 tmp = entry2str( e, &len );
103                 while ( (tmp = strchr( tmp, '\n' )) != NULL ) {
104                         tmp++;
105                         if ( ! isspace( (unsigned char) *tmp ) )
106                                 break;
107                 }
108                 fprintf( fp, "%s", tmp );
109                 ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
110                 break;
111
112         case LDAP_REQ_DELETE:
113                 fprintf( fp, "changetype: delete\n" );
114                 break;
115
116         case LDAP_REQ_MODRDN:
117                 moddn = change;
118                 fprintf( fp, "changetype: modrdn\n" );
119                 fprintf( fp, "newrdn: %s\n", moddn->newrdn );
120                 fprintf( fp, "deleteoldrdn: %d\n", moddn->deloldrdn ? 1 : 0 );
121                 if( moddn->newsup != NULL ) {
122                         fprintf( fp, "newsuperior: %s\n", moddn->newsup );
123                 }
124         }
125         fprintf( fp, "\n" );
126
127         lock_fclose( fp, lfp );
128         ldap_pvt_thread_mutex_unlock( &replog_mutex );
129 }