xref: /third_party/toybox/toys/other/flock.c (revision 0f66f451)
1/* flock.c - manage advisory file locks
2 *
3 * Copyright 2015 The Android Open Source Project
4
5USE_FLOCK(NEWTOY(flock, "<1>1nsux[-sux]", TOYFLAG_USR|TOYFLAG_BIN))
6
7config FLOCK
8  bool "flock"
9  default y
10  help
11    usage: flock [-sxun] fd
12
13    Manage advisory file locks.
14
15    -s	Shared lock
16    -x	Exclusive lock (default)
17    -u	Unlock
18    -n	Non-blocking: fail rather than wait for the lock
19*/
20
21#define FOR_flock
22#include "toys.h"
23
24#include <sys/file.h>
25
26void flock_main(void)
27{
28  int fd = xstrtol(*toys.optargs, NULL, 10), op;
29
30  if (toys.optflags & FLAG_u) op = LOCK_UN;
31  else op = (toys.optflags & FLAG_s) ? LOCK_SH : LOCK_EX;
32
33  if (toys.optflags & FLAG_n) op |= LOCK_NB;
34
35  if (flock(fd, op)) {
36    if ((op & LOCK_NB) && errno == EAGAIN) toys.exitval = 1;
37    else perror_exit("flock");
38  }
39}
40