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