blob: d8f82efd3b1d2395bfdd6ef9464e2bc0b28feb0f [file] [log] [blame]
Rich Felker0b44a032011-02-12 00:22:29 -05001#include <unistd.h>
2#include <fcntl.h>
3#include <errno.h>
4#include "libc.h"
5
6int lockf(int fd, int op, off_t size)
7{
8 struct flock l = {
9 .l_type = F_WRLCK,
10 .l_whence = SEEK_CUR,
11 .l_len = size,
12 };
13 switch (op) {
14 case F_TEST:
15 l.l_type = F_RDLCK;
16 if (fcntl(fd, F_GETLK, &l) < 0)
17 return -1;
18 if (l.l_type == F_UNLCK || l.l_pid == getpid())
19 return 0;
20 errno = EACCES;
21 return -1;
22 case F_ULOCK:
23 l.l_type = F_UNLCK;
24 case F_TLOCK:
25 return fcntl(fd, F_SETLK, &l);
26 case F_LOCK:
27 return fcntl(fd, F_SETLKW, &l);
28 }
29 errno = EINVAL;
30 return -1;
31}
32
33LFS64(lockf);