#include <unistd.h> | |
#include <fcntl.h> | |
#include <errno.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; | |
} |