]>
Commit | Line | Data |
---|---|---|
23bddc06 | 1 | /* Copyright (C) 1994-2012 Free Software Foundation, Inc. |
590a6393 UD |
2 | This file is part of the GNU C Library. |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
5 | modify it under the terms of the GNU Lesser General Public |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
590a6393 UD |
8 | |
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 12 | Lesser General Public License for more details. |
590a6393 | 13 | |
41bdb6e2 | 14 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
15 | License along with the GNU C Library; if not, see |
16 | <http://www.gnu.org/licenses/>. */ | |
590a6393 UD |
17 | |
18 | #include <sys/types.h> | |
19 | #include <unistd.h> | |
20 | #include <fcntl.h> | |
21 | #include <errno.h> | |
22 | #include <string.h> | |
23 | #include <sysdep.h> | |
24 | ||
590a6393 UD |
25 | /* lockf is a simplified interface to fcntl's locking facilities. */ |
26 | ||
590a6393 UD |
27 | int |
28 | lockf64 (int fd, int cmd, off64_t len64) | |
29 | { | |
590a6393 UD |
30 | struct flock64 fl64; |
31 | int cmd64; | |
590a6393 | 32 | |
23bddc06 JM |
33 | memset ((char *) &fl64, '\0', sizeof (fl64)); |
34 | fl64.l_whence = SEEK_CUR; | |
35 | fl64.l_start = 0; | |
36 | fl64.l_len = len64; | |
590a6393 | 37 | |
590a6393 UD |
38 | switch (cmd) |
39 | { | |
40 | case F_TEST: | |
41 | /* Test the lock: return 0 if FD is unlocked or locked by this process; | |
42 | return -1, set errno to EACCES, if another process holds the lock. */ | |
35b99c57 | 43 | fl64.l_type = F_RDLCK; |
590a6393 UD |
44 | if (INLINE_SYSCALL (fcntl64, 3, fd, F_GETLK64, &fl64) < 0) |
45 | return -1; | |
46 | if (fl64.l_type == F_UNLCK || fl64.l_pid == __getpid ()) | |
47 | return 0; | |
48 | __set_errno (EACCES); | |
49 | return -1; | |
590a6393 | 50 | case F_ULOCK: |
590a6393 UD |
51 | fl64.l_type = F_UNLCK; |
52 | cmd64 = F_SETLK64; | |
590a6393 UD |
53 | break; |
54 | case F_LOCK: | |
590a6393 UD |
55 | fl64.l_type = F_WRLCK; |
56 | cmd64 = F_SETLKW64; | |
590a6393 UD |
57 | break; |
58 | case F_TLOCK: | |
590a6393 UD |
59 | fl64.l_type = F_WRLCK; |
60 | cmd64 = F_SETLK64; | |
590a6393 UD |
61 | break; |
62 | ||
63 | default: | |
64 | __set_errno (EINVAL); | |
65 | return -1; | |
66 | } | |
590a6393 | 67 | return INLINE_SYSCALL (fcntl64, 3, fd, cmd64, &fl64); |
590a6393 | 68 | } |