]> err.no Git - util-linux/commitdiff
flock: Allow lock directory
authorAlexey Gladkov <legion@altlinux.org>
Mon, 24 Nov 2008 15:15:36 +0000 (18:15 +0300)
committerKarel Zak <kzak@redhat.com>
Wed, 3 Dec 2008 09:33:53 +0000 (10:33 +0100)
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 <legion@altlinux.org>
sys-utils/flock.1
sys-utils/flock.c

index 6965ba72e0d5b35b9013b913381f81f79191ea57..6d60ff71f3c847dd31bb3fd46c5fd92fbeea4dc2 100644 (file)
@@ -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(
index 6c1acc32f77fcc72484903b83a9064211cd8b978..029e4364729d54fa92b86c059a323834fac381f0 100644 (file)
@@ -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;