lockf.c 545 B

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