]> git.sur5r.net Git - openldap/blob - servers/slapd/repl.c
Initial revision
[openldap] / servers / slapd / repl.c
1 /* repl.c - log modifications for replication purposes */
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/file.h>
7 #include <sys/socket.h>
8 #include <slap.h>
9
10 extern pthread_mutex_t  replog_mutex;
11 extern pthread_mutex_t  entry2str_mutex;
12 extern time_t           currenttime;
13 extern char             *replogfile;
14
15 extern FILE     *lock_fopen();
16 extern int      lock_fclose();
17 extern char     *ch_malloc();
18 extern char     *entry2str();
19
20 void
21 replog(
22     Backend     *be,
23     int         optype,
24     char        *dn,
25     void        *change,
26     int         flag
27 )
28 {
29         LDAPMod *mods;
30         Entry   *e;
31         char    *newrdn, *tmp;
32         int     deleteoldrdn;
33         FILE    *fp, *lfp;
34         int     len, i;
35
36         if ( be->be_replogfile == NULL && replogfile == NULL ) {
37                 return;
38         }
39
40         pthread_mutex_lock( &replog_mutex );
41         if ( (fp = lock_fopen( be->be_replogfile ? be->be_replogfile :
42             replogfile, "a", &lfp )) == NULL ) {
43                 pthread_mutex_unlock( &replog_mutex );
44                 return;
45         }
46
47         for ( i = 0; be->be_replica != NULL && be->be_replica[i] != NULL;
48             i++ ) {
49                 fprintf( fp, "replica: %s\n", be->be_replica[i] );
50         }
51         fprintf( fp, "time: %ld\n", currenttime );
52         fprintf( fp, "dn: %s\n", dn );
53
54         switch ( optype ) {
55         case LDAP_REQ_MODIFY:
56                 fprintf( fp, "changetype: modify\n" );
57                 mods = change;
58                 for ( ; mods != NULL; mods = mods->mod_next ) {
59                         switch ( mods->mod_op & ~LDAP_MOD_BVALUES ) {
60                         case LDAP_MOD_ADD:
61                                 fprintf( fp, "add: %s\n", mods->mod_type );
62                                 break;
63
64                         case LDAP_MOD_DELETE:
65                                 fprintf( fp, "delete: %s\n", mods->mod_type );
66                                 break;
67
68                         case LDAP_MOD_REPLACE:
69                                 fprintf( fp, "replace: %s\n", mods->mod_type );
70                                 break;
71                         }
72
73                         for ( i = 0; mods->mod_bvalues != NULL &&
74                             mods->mod_bvalues[i] != NULL; i++ ) {
75                                 char    *buf, *bufp;
76
77                                 len = strlen( mods->mod_type );
78                                 len = LDIF_SIZE_NEEDED( len,
79                                     mods->mod_bvalues[i]->bv_len ) + 1;
80                                 buf = ch_malloc( len );
81
82                                 bufp = buf;
83                                 put_type_and_value( &bufp, mods->mod_type,
84                                     mods->mod_bvalues[i]->bv_val,
85                                     mods->mod_bvalues[i]->bv_len );
86                                 *bufp = '\0';
87
88                                 fputs( buf, fp );
89
90                                 free( buf );
91                         }
92                         fprintf( fp, "-\n" );
93                 }
94                 break;
95
96         case LDAP_REQ_ADD:
97                 e = change;
98                 fprintf( fp, "changetype: add\n" );
99                 pthread_mutex_lock( &entry2str_mutex );
100                 tmp = entry2str( e, &len, 0 );
101                 while ( (tmp = strchr( tmp, '\n' )) != NULL ) {
102                         tmp++;
103                         if ( ! isspace( *tmp ) )
104                                 break;
105                 }
106                 fprintf( fp, "%s", tmp );
107                 pthread_mutex_unlock( &entry2str_mutex );
108                 break;
109
110         case LDAP_REQ_DELETE:
111                 fprintf( fp, "changetype: delete\n" );
112                 break;
113
114         case LDAP_REQ_MODRDN:
115                 newrdn = change;
116                 fprintf( fp, "changetype: modrdn\n" );
117                 fprintf( fp, "newrdn: %s\n", newrdn );
118                 fprintf( fp, "deleteoldrdn: %d\n", flag ? 1 : 0 );
119         }
120         fprintf( fp, "\n" );
121
122         lock_fclose( fp, lfp );
123         pthread_mutex_unlock( &replog_mutex );
124 }