View | Details | Raw Unified | Return to bug 8752
Collapse All | Expand All

(-)file_not_specified_in_diff (-4 / +125 lines)
Line  Link Here
0
-- orig/src/internal.h
0
++ mod/src/internal.h
Lines 5-10 Link Here
5
# define LIBRCC_DATA_DIR "/usr/lib/rcc"
5
# define LIBRCC_DATA_DIR "/usr/lib/rcc"
6
#endif /* LIBRCC_DATA_DIR */
6
#endif /* LIBRCC_DATA_DIR */
7
7
8
#ifndef LIBRCC_LOCK_WAIT
9
# define LIBRCC_LOCK_WAIT 3000 /* ms */
10
#endif /* LIBRCC_LOCK_WAIT */
11
8
#define RCC_MAX_LANGUAGE_PARRENTS 4
12
#define RCC_MAX_LANGUAGE_PARRENTS 4
9
#define RCC_MAX_RELATIONS RCC_MAX_LANGUAGES
13
#define RCC_MAX_RELATIONS RCC_MAX_LANGUAGES
10
14
Lines 91-96 Link Here
91
};
95
};
92
typedef struct rcc_context_t rcc_context_s;
96
typedef struct rcc_context_t rcc_context_s;
93
97
98
int rccLock();
99
void rccUnLock();
100
94
int rccConfigure(rcc_context ctx);
101
int rccConfigure(rcc_context ctx);
95
char *rccCreateResult(rcc_context ctx, size_t len);
102
char *rccCreateResult(rcc_context ctx, size_t len);
96
103
97
-- orig/src/librcc.c
104
++ mod/src/librcc.c
Lines 1-6 Link Here
1
#include <stdio.h>
1
#include <stdio.h>
2
#include <string.h>
2
#include <string.h>
3
#include <stdlib.h>
3
#include <stdlib.h>
4
#include <time.h>
5
#include <errno.h>
4
6
5
#include "../config.h"
7
#include "../config.h"
6
8
Lines 19-24 Link Here
19
# include <pwd.h>
21
# include <pwd.h>
20
#endif /* HAVE_PWD_H */
22
#endif /* HAVE_PWD_H */
21
23
24
#ifdef HAVE_SYS_FILE_H
25
# include <sys/file.h>
26
#endif /* HAVE_SYS_FILE_H */
27
28
22
#include "internal.h"
29
#include "internal.h"
23
#include "rccconfig.h"
30
#include "rccconfig.h"
24
#include "rccenca.h"
31
#include "rccenca.h"
Lines 135-140 Link Here
135
    initialized = 0;
142
    initialized = 0;
136
}
143
}
137
144
145
static int lockfd = -1;
146
147
int rccLock() {
148
# ifdef HAVE_SYS_FILE_H
149
    int err, i;
150
    int size;
151
    char *stmp;
152
    struct timespec wait = { 0, 10000000 };
153
    
154
    if (lockfd>=0) return -1;    
155
    
156
    size = strlen(rcc_home_dir) + 32;
157
    stmp = (char*)malloc(size*sizeof(char));
158
    if (!stmp) return -1;
159
160
    sprintf(stmp,"%s/.rcc/", rcc_home_dir);
161
    mkdir(stmp, 00755);
162
    
163
    sprintf(stmp,"%s/.rcc/locks/", rcc_home_dir);
164
    mkdir(stmp, 00700);
165
166
    sprintf(stmp,"%s/.rcc/locks/rcc.lock", rcc_home_dir);
167
168
    lockfd = open(stmp, O_RDWR|O_CREAT, 0644);
169
    if (lockfd >= 0) {
170
	for (err = -1, i = 0; i < (LIBRCC_LOCK_WAIT/10); i++) {
171
	    err = flock(lockfd, LOCK_EX|LOCK_NB);
172
	    if ((err)&&(errno == EWOULDBLOCK)) nanosleep(&wait, NULL);
173
	    else break;
174
	}
175
176
	if (err) {
177
	    close(lockfd);
178
179
		// Removing invalid lock
180
	    if (i == (LIBRCC_LOCK_WAIT/10)) {
181
		remove(stmp);
182
183
		lockfd = open(stmp, O_RDWR|O_CREAT, 0644);
184
		if (lockfd >= 0) {
185
		    for (err = -1, i = 0; i < (LIBRCC_LOCK_WAIT/10); i++) {
186
			err = flock(lockfd, LOCK_EX|LOCK_NB);
187
			if ((err)&&(errno == EWOULDBLOCK)) nanosleep(&wait, NULL);
188
			else break;
189
		    }
190
		    
191
		    if (err) close(lockfd);
192
		    else return 0;
193
		} 
194
	    }
195
	    
196
	    lockfd = -1;
197
	    return -1;
198
	} 
199
200
	return 0;
201
    }
202
    
203
    return -1;
204
# else  /* HAVE_SYS_FILE_H */
205
    return 0;
206
# endif /* HAVE_SYS_FILE_H */
207
}
208
209
void rccUnLock() {
210
#ifdef HAVE_SYS_FILE_H
211
    int size;
212
    char *stmp;
213
214
    if (lockfd<0) return;
215
    
216
    size = strlen(rcc_home_dir) + 32;
217
    stmp = (char*)malloc(size*sizeof(char));
218
    if (!stmp) return;
219
220
    sprintf(stmp,"%s/.rcc/locks/rcc.lock", rcc_home_dir);
221
222
    flock(lockfd, LOCK_UN);
223
    close(lockfd);
224
    lockfd = -1;
225
#endif /* HAVE_SYS_FILE_H */
226
}
227
138
rcc_context rccCreateContext(const char *locale_variable, unsigned int max_languages, unsigned int max_classes, rcc_class_ptr defclasses, rcc_init_flags flags) {
228
rcc_context rccCreateContext(const char *locale_variable, unsigned int max_languages, unsigned int max_classes, rcc_class_ptr defclasses, rcc_init_flags flags) {
139
    unsigned int i;
229
    unsigned int i;
140
    
230
    
141
-- orig/src/rccdb4.c
231
++ mod/src/rccdb4.c
Lines 15-25 Link Here
15
#ifdef HAVE_DB_H
15
#ifdef HAVE_DB_H
16
    DB_ENV *dbe;
16
    DB_ENV *dbe;
17
    DB *db;
17
    DB *db;
18
19
    char stmp[160];
18
    
20
    
19
    err = db_env_create(&dbe, 0);
21
    err = db_env_create(&dbe, 0);
20
    if (err) return NULL;
22
    if (err) return NULL;
23
24
    err = dbe->open(dbe, dbpath, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL, 00644);
25
    if (err == DB_VERSION_MISMATCH) {
26
27
	if (!rccLock()) {    
28
	    err = dbe->open(dbe, dbpath, DB_CREATE|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_MPOOL|DB_INIT_TXN|DB_USE_ENVIRON|DB_PRIVATE|DB_RECOVER, 0);
29
	    rccUnLock();
30
	} else err = -1;
31
32
	dbe->close(dbe, 0);
33
	if (err) return NULL;
34
35
	if (strlen(dbpath)<128) {
36
	    sprintf(stmp, "%s/log.0000000001", dbpath);
37
	    remove(stmp);
38
	}
39
	    
40
	err = db_env_create(&dbe, 0);
41
	if (err) return NULL;
42
	    
43
	err = dbe->open(dbe, dbpath, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL, 00644);
44
	
45
    }
21
    
46
    
22
    err = dbe->open(dbe, dbpath, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL, 00755);
23
    if (err) {
47
    if (err) {
24
	dbe->close(dbe, 0);
48
	dbe->close(dbe, 0);
25
	return NULL;
49
	return NULL;

Return to bug 8752