blob: 4052cc1f8749cbf168ce63549c595a6f8a5a2c0c [file] [log] [blame]
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int lockf(int fd, int op, off_t size) {
struct flock l = {
.l_type = F_WRLCK, .l_whence = SEEK_CUR, .l_len = size,
};
switch (op) {
case F_TEST:
l.l_type = F_RDLCK;
if (fcntl(fd, F_GETLK, &l) < 0)
return -1;
if (l.l_type == F_UNLCK || l.l_pid == getpid())
return 0;
errno = EACCES;
return -1;
case F_ULOCK:
l.l_type = F_UNLCK;
case F_TLOCK:
return fcntl(fd, F_SETLK, &l);
case F_LOCK:
return fcntl(fd, F_SETLKW, &l);
}
errno = EINVAL;
return -1;
}