aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toys/other/flock.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/toys/other/flock.c b/toys/other/flock.c
new file mode 100644
index 00000000..1d56a568
--- /dev/null
+++ b/toys/other/flock.c
@@ -0,0 +1,40 @@
+/* flock.c - manage advisory file locks
+ *
+ * Copyright 2015 The Android Open Source Project
+
+USE_FLOCK(NEWTOY(flock, "<1>1nsux[-sux]", TOYFLAG_USR|TOYFLAG_BIN))
+
+config FLOCK
+ bool "flock"
+ default y
+ help
+ usage: flock [-sxun] fd
+
+ Manage advisory file locks.
+
+ -s Shared lock.
+ -x Exclusive lock (default).
+ -u Unlock.
+ -n Non-blocking: fail rather than wait for the lock.
+*/
+
+#define FOR_flock
+#include "toys.h"
+
+#include <sys/file.h>
+
+void flock_main(void)
+{
+ int fd = xstrtol(*toys.optargs, NULL, 10);
+ int op;
+
+ if ((toys.optflags & FLAG_u)) op = LOCK_UN;
+ else op = (toys.optflags & FLAG_s) ? LOCK_SH : LOCK_EX;
+
+ if ((toys.optflags & FLAG_n)) op |= LOCK_NB;
+
+ if (flock(fd, op)) {
+ if ((op & LOCK_NB) && errno == EAGAIN) toys.exitval = 1;
+ else perror_exit("flock");
+ }
+}