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 Workervoid 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