summaryrefslogtreecommitdiff
path: root/src/libstddjb/fd_lock.c
blob: e9d1a620d2d06ba3e38b9d40bf26710ef0624fa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* ISC license. */

#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

#include <skalibs/error.h>
#include <skalibs/djbunix.h>

int fd_lock (int fd, int w, int nb)
{
  struct flock fl =
  {
    .l_type = w ? F_WRLCK : F_RDLCK,
    .l_whence = SEEK_SET,
    .l_start = 0,
    .l_len = 0
  } ;
  int e = errno ;
  int r ;
  do r = fcntl(fd, nb ? F_SETLK : F_SETLKW, &fl) ;
  while (r < 0 && errno == EINTR) ;
  return r >= 0 ? 1 :
    errno == EACCES || error_isagain(errno) ? (errno = e, 0) :
    -1 ;
}