1.1 --- a/librazor/razor.c Thu Oct 01 19:54:03 2009 +0100
1.2 +++ b/librazor/razor.c Thu Oct 01 20:02:23 2009 +0100
1.3 @@ -37,6 +37,9 @@
1.4 #include <fnmatch.h>
1.5 #include <limits.h>
1.6 #include <assert.h>
1.7 +#ifdef MSWIN_API
1.8 +#include <windows.h>
1.9 +#endif
1.10
1.11 #include "razor-internal.h"
1.12 #include "razor.h"
1.13 @@ -93,6 +96,8 @@
1.14 empty = array_add(&set->string_pool, 1);
1.15 *empty = '\0';
1.16
1.17 + set->lock_fd = -1;
1.18 +
1.19 return set;
1.20 }
1.21
1.22 @@ -138,6 +143,13 @@
1.23 return -1;
1.24 }
1.25
1.26 + if (set->mapped_files == NULL) {
1.27 + for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
1.28 + array = (void *) set + razor_sections[i].offset;
1.29 + array_release(array);
1.30 + }
1.31 + }
1.32 +
1.33 file->next = set->mapped_files;
1.34 set->mapped_files = file;
1.35
1.36 @@ -167,6 +179,7 @@
1.37 struct razor_set *set;
1.38
1.39 set = zalloc(sizeof *set);
1.40 + set->lock_fd = -1;
1.41 if (razor_set_bind_sections(set, filename)){
1.42 free(set);
1.43 return NULL;
1.44 @@ -174,6 +187,56 @@
1.45 return set;
1.46 }
1.47
1.48 +int
1.49 +razor_set_aquire_lock(struct razor_set *set, const char *path, int exclusive)
1.50 +{
1.51 + int fd;
1.52 + assert(set != NULL);
1.53 +
1.54 + if (path) {
1.55 + fd = open(path, O_CREAT | O_RDWR | O_TRUNC | O_BINARY, 0666);
1.56 + if (fd < 0)
1.57 + return -1;
1.58 + } else {
1.59 + fd = -1;
1.60 + }
1.61 +
1.62 +#ifdef MSWIN_API
1.63 + DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;
1.64 + OVERLAPPED lock = {0};
1.65 +
1.66 + if (exclusive)
1.67 + flags |= LOCKFILE_EXCLUSIVE_LOCK;
1.68 + if (fd >= 0 && !LockFileEx(_get_osfhandle(fd), flags, 0, 1, 0, &lock)) {
1.69 + close(fd);
1.70 + return -1;
1.71 + }
1.72 + if (set->lock_fd >= 0)
1.73 + (void)UnlockFile(_get_osfhandle(set->lock_fd), 0, 0, 1, 0);
1.74 +#else
1.75 + struct flock lock = {0};
1.76 +
1.77 + lock.l_type = exclusive ? F_WRLCK : F_RDLCK;
1.78 + lock.l_whence = SEEK_SET;
1.79 + lock.l_start = 0;
1.80 + lock.l_len = 0;
1.81 + if (fd >= 0 && fcntl(fd, F_SETLK, &lock) < 0) {
1.82 + close(fd);
1.83 + return -1;
1.84 + }
1.85 + if (set->lock_fd >= 0) {
1.86 + lock.l_type = F_UNLCK;
1.87 + (void)fcntl(set->lock_fd, F_SETLK, &lock);
1.88 + }
1.89 +#endif
1.90 +
1.91 + if (set->lock_fd >= 0)
1.92 + close(set->lock_fd);
1.93 + set->lock_fd = fd;
1.94 +
1.95 + return 0;
1.96 +}
1.97 +
1.98 RAZOR_EXPORT void
1.99 razor_set_destroy(struct razor_set *set)
1.100 {
1.101 @@ -196,6 +259,7 @@
1.102 }
1.103 }
1.104
1.105 + razor_set_aquire_lock(set, NULL, 0);
1.106 free(set);
1.107 }
1.108