]> git.ipfire.org Git - thirdparty/glibc.git/blame - io/lockf.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / io / lockf.c
CommitLineData
b168057a 1/* Copyright (C) 1994-2015 Free Software Foundation, Inc.
c84142e8 2 This file is part of the GNU C Library.
28f540f4 3
c84142e8 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.
28f540f4 8
c84142e8
UD
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.
28f540f4 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/>. */
28f540f4 17
03af9520
RM
18/* We need to avoid the header declaration of lockf64, because
19 the types don't match lockf and then the compiler will
20 complain about the mismatch when we do the alias below. */
21#define lockf64 __renamed_lockf64
22
23#include <fcntl.h>
24
25#undef lockf64
26
28f540f4
RM
27#include <sys/types.h>
28#include <unistd.h>
28f540f4 29#include <errno.h>
9c2322bc 30#include <string.h>
28f540f4
RM
31
32/* lockf is a simplified interface to fcntl's locking facilities. */
33
34int
35lockf (int fd, int cmd, off_t len)
36{
37 struct flock fl;
38
9c2322bc
UD
39 memset ((char *) &fl, '\0', sizeof (fl));
40
bfce746a
UD
41 /* lockf is always relative to the current file position. */
42 fl.l_whence = SEEK_CUR;
43 fl.l_start = 0;
44 fl.l_len = len;
45
28f540f4
RM
46 switch (cmd)
47 {
48 case F_TEST:
49 /* Test the lock: return 0 if FD is unlocked or locked by this process;
50 return -1, set errno to EACCES, if another process holds the lock. */
9c3b1ceb 51 fl.l_type = F_RDLCK;
50304ef0 52 if (__fcntl (fd, F_GETLK, &fl) < 0)
28f540f4 53 return -1;
50304ef0 54 if (fl.l_type == F_UNLCK || fl.l_pid == __getpid ())
28f540f4 55 return 0;
c4029823 56 __set_errno (EACCES);
28f540f4
RM
57 return -1;
58
59 case F_ULOCK:
60 fl.l_type = F_UNLCK;
61 cmd = F_SETLK;
62 break;
63 case F_LOCK:
64 fl.l_type = F_WRLCK;
65 cmd = F_SETLKW;
66 break;
67 case F_TLOCK:
68 fl.l_type = F_WRLCK;
69 cmd = F_SETLK;
70 break;
71
72 default:
c4029823 73 __set_errno (EINVAL);
28f540f4
RM
74 return -1;
75 }
76
7a114794
UD
77 /* lockf() is a cancellation point but so is fcntl() if F_SETLKW is
78 used. Therefore we don't have to care about cancellation here,
79 the fcntl() function will take care of it. */
50304ef0 80 return __fcntl (fd, cmd, &fl);
28f540f4 81}
03af9520
RM
82
83#ifdef __OFF_T_MATCHES_OFF64_T
84weak_alias (lockf, lockf64)
85#endif