diff options
Diffstat (limited to 'contrib/Win32/flock.c')
-rw-r--r-- | contrib/Win32/flock.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/contrib/Win32/flock.c b/contrib/Win32/flock.c new file mode 100644 index 00000000..89238625 --- /dev/null +++ b/contrib/Win32/flock.c | |||
@@ -0,0 +1,57 @@ | |||
1 | /* Copyrights 2002 Luis Figueiredo (stdio@netc.pt) All rights reserved. | ||
2 | * | ||
3 | * See the LICENSE file | ||
4 | * | ||
5 | * The origin of this software must not be misrepresented, either by | ||
6 | * explicit claim or by omission. Since few users ever read sources, | ||
7 | * credits must appear in the documentation. | ||
8 | * | ||
9 | * date: 19:49,07-49-2002 | ||
10 | * | ||
11 | * -- description: File lock for winnt | ||
12 | * | ||
13 | |||
14 | /*********************************************************************************************************/ | ||
15 | /* | ||
16 | * simulate a file lock, using locking region on WINNT | ||
17 | */ | ||
18 | #include "flock.h" | ||
19 | |||
20 | |||
21 | |||
22 | #define LK_ERR(f,i) ((f) ? (i = 0) : (i=-1)) | ||
23 | #define LK_LEN 0xffff0000 | ||
24 | |||
25 | int flock(int fd, int oper) { | ||
26 | OVERLAPPED o; | ||
27 | int i = -1; | ||
28 | HANDLE fh; | ||
29 | |||
30 | fh = (HANDLE)_get_osfhandle(fd); | ||
31 | memset(&o, 0, sizeof(o)); | ||
32 | |||
33 | switch(oper) { | ||
34 | case LOCK_SH: /* shared lock */ | ||
35 | LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i); | ||
36 | break; | ||
37 | case LOCK_EX: /* exclusive lock */ | ||
38 | LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i); | ||
39 | break; | ||
40 | case LOCK_SH|LOCK_NB: /* non-blocking shared lock */ | ||
41 | LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i); | ||
42 | break; | ||
43 | case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */ | ||
44 | LK_ERR(LockFileEx(fh,LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,0, LK_LEN, 0, &o),i); | ||
45 | break; | ||
46 | case LOCK_UN: /* unlock lock */ | ||
47 | LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i); | ||
48 | break; | ||
49 | default: /* unknown */ | ||
50 | //errno = EINVAL; // i heard that on some versions errno is a function (win32 MT lib?) | ||
51 | break; | ||
52 | } | ||
53 | return i; | ||
54 | } | ||
55 | |||
56 | #undef LK_ERR | ||
57 | #undef LK_LEN \ No newline at end of file | ||