From: Alexey Gladkov Date: Mon, 24 Nov 2008 15:15:36 +0000 (+0300) Subject: flock: Allow lock directory X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff5717391c3cebb4799c8e5d6dd9876fc5005fd0;p=util-linux flock: Allow lock directory With this patch, you can lock directory. Additionally, lockfile opens with O_NOCTTY. Try to open file with O_CREAT flag first, and without it if open fails with EISDIR. Suggested by H. Peter Anvin. Signed-off-by: Alexey Gladkov --- diff --git a/sys-utils/flock.1 b/sys-utils/flock.1 index 6965ba72..6d60ff71 100644 --- a/sys-utils/flock.1 +++ b/sys-utils/flock.1 @@ -30,6 +30,8 @@ flock \- Manage locks from shell scripts .SH SYNOPSIS \fBflock\fP [\fB\-sxon\fP] [\fB\-w\fP \fItimeout\fP] \fIlockfile\fP [\fB\-c\fP] \fIcommand...\fP .PP +\fBflock\fP [\fB\-sxon\fP] [\fB\-w\fP \fItimeout\fP] \fIlockdir\fP [\fB\-c\fP] \fIcommand...\fP +.PP \fBflock\fP [\fB\-sxun\fP] [\fB\-w\fP \fItimeout\fP] \fIfd\fP .SH DESCRIPTION .PP @@ -37,14 +39,14 @@ This utility manages .BR flock (2) locks from within shell scripts or the command line. .PP -The first form wraps the lock around the executing a command, in a manner similar to +The first and second forms wraps the lock around the executing a command, in a manner similar to .BR su (1) or .BR newgrp (1). -It locks a specified file, which is created (assuming appropriate +It locks a specified file or directory, which is created (assuming appropriate permissions), if it does not already exist. .PP -The second form is convenient inside shell scripts, and is usually +The third form is convenient inside shell scripts, and is usually used the following manner: .PP \fC( diff --git a/sys-utils/flock.c b/sys-utils/flock.c index 6c1acc32..029e4364 100644 --- a/sys-utils/flock.c +++ b/sys-utils/flock.c @@ -62,6 +62,7 @@ static void usage(int ex) "flock (%s)\n" "Usage: %s [-sxun][-w #] fd#\n" " %s [-sxon][-w #] file [-c] command...\n" + " %s [-sxon][-w #] directory [-c] command...\n" " -s --shared Get a shared lock\n" " -x --exclusive Get an exclusive lock\n" " -u --unlock Remove a lock\n" @@ -201,7 +202,11 @@ int main(int argc, char *argv[]) } filename = argv[optind]; - fd = open(filename, O_RDONLY|O_CREAT, 0666); + fd = open(filename, O_RDONLY|O_NOCTTY|O_CREAT, 0666); + /* Linux doesn't like O_CREAT on a directory, even though it should be a + no-op */ + if (fd < 0 && errno == EISDIR) + fd = open(filename, O_RDONLY|O_NOCTTY); if ( fd < 0 ) { err = errno;