From 661540a99f2c346d7fb2a4b83db2e31a7d204490 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 6 Oct 2015 07:19:28 -0500 Subject: New command: flock. 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 | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 toys/other/flock.c 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 + +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"); + } +} -- cgit v1.2.3