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