From 87d83b6ad2e52a3c867fe2f758e4eccaea145a10 Mon Sep 17 00:00:00 2001 From: Petr Uzel Date: Thu, 15 Sep 2011 10:19:17 +0200 Subject: flock: make flock(1) work on NFSv4 To pleace an exclusive lock on a file, NFSv4 requires the file to be opened RW because of the emulation of flock() by fcntl(): http://www.spinics.net/lists/linux-nfs/msg18502.html So instead of O_RDONLY, open the file in O_RDWR if access() indicates it is possible (unless shared lock is requested). From: Michal Kubecek Signed-off-by: Petr Uzel --- sys-utils/flock.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'sys-utils/flock.c') diff --git a/sys-utils/flock.c b/sys-utils/flock.c index 7d321de0d..a5003193e 100644 --- a/sys-utils/flock.c +++ b/sys-utils/flock.c @@ -129,6 +129,7 @@ int main(int argc, char *argv[]) int have_timeout = 0; int type = LOCK_EX; int block = 0; + int open_accmode; int fd = -1; int opt, ix; int do_close = 0; @@ -211,9 +212,11 @@ int main(int argc, char *argv[]) } filename = argv[optind]; - fd = open(filename, O_RDONLY|O_NOCTTY|O_CREAT, 0666); + open_accmode = ((type == LOCK_SH || access(filename, R_OK|W_OK) < 0) ? + O_RDONLY : O_RDWR); + fd = open(filename, open_accmode|O_NOCTTY|O_CREAT, 0666); /* Linux doesn't like O_CREAT on a directory, even though it should be a - no-op */ + no-op; POSIX doesn't allow O_RDWR or O_WRONLY */ if (fd < 0 && errno == EISDIR) fd = open(filename, O_RDONLY|O_NOCTTY); -- cgit v1.2.3-55-g7522