OSDN Git Service

New command: flock.
authorElliott Hughes <enh@google.com>
Tue, 6 Oct 2015 12:19:28 +0000 (07:19 -0500)
committerRob Landley <rob@landley.net>
Tue, 6 Oct 2015 12:19:28 +0000 (07:19 -0500)
The brillo folks wanted this in a shell script they're porting over
(so I've only implemented the fd style they wanted, not the named file
style).

toys/other/flock.c [new file with mode: 0644]

diff --git a/toys/other/flock.c b/toys/other/flock.c
new file mode 100644 (file)
index 0000000..1d56a56
--- /dev/null
@@ -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");
+  }
+}