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