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 <legion@altlinux.org>
This commit is contained in:
Alexey Gladkov 2008-11-24 18:15:36 +03:00 committed by Karel Zak
parent 8da18ddb81
commit ff5717391c
2 changed files with 11 additions and 4 deletions

View 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(

View 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;