librazor/razor.c
changeset 388 6a6462ce8a08
parent 387 ef9237601f24
child 390 297c6c8be2d1
     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:12 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