Implement -o for flock(1) to close fd before exec
This commit is contained in:
parent
09c3caa56d
commit
7b9988c7ff
5
flock.1
5
flock.1
@ -6,7 +6,7 @@
|
|||||||
.Nd tool to manage locks on files
|
.Nd tool to manage locks on files
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl nsux
|
.Op Fl nosux
|
||||||
.Ar file
|
.Ar file
|
||||||
.Ar cmd Op arg ...
|
.Ar cmd Op arg ...
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
@ -20,6 +20,9 @@ does not exist, it will be created.
|
|||||||
.It Fl n
|
.It Fl n
|
||||||
Set non-blocking mode on the lock. Fail immediately if the lock
|
Set non-blocking mode on the lock. Fail immediately if the lock
|
||||||
cannot be acquired.
|
cannot be acquired.
|
||||||
|
.It Fl o
|
||||||
|
Close the file descriptor before exec to avoid having the exec'ed
|
||||||
|
program holding on to the lock.
|
||||||
.It Fl s
|
.It Fl s
|
||||||
Acquire a shared lock.
|
Acquire a shared lock.
|
||||||
.It Fl u
|
.It Fl u
|
||||||
|
9
flock.c
9
flock.c
@ -12,19 +12,22 @@
|
|||||||
static void
|
static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
eprintf("usage: %s [-nsux] file cmd [arg ...]\n", argv0);
|
eprintf("usage: %s [-nosux] file cmd [arg ...]\n", argv0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int fd, status, savederrno, flags = LOCK_EX, nonblk = 0;
|
int fd, status, savederrno, flags = LOCK_EX, nonblk = 0, oflag = 0;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
ARGBEGIN {
|
ARGBEGIN {
|
||||||
case 'n':
|
case 'n':
|
||||||
nonblk = LOCK_NB;
|
nonblk = LOCK_NB;
|
||||||
break;
|
break;
|
||||||
|
case 'o':
|
||||||
|
oflag = 1;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
flags = LOCK_SH;
|
flags = LOCK_SH;
|
||||||
break;
|
break;
|
||||||
@ -54,6 +57,8 @@ main(int argc, char *argv[])
|
|||||||
case -1:
|
case -1:
|
||||||
eprintf("fork:");
|
eprintf("fork:");
|
||||||
case 0:
|
case 0:
|
||||||
|
if (oflag && close(fd) < 0)
|
||||||
|
eprintf("close:");
|
||||||
argv++;
|
argv++;
|
||||||
execvp(*argv, argv);
|
execvp(*argv, argv);
|
||||||
savederrno = errno;
|
savederrno = errno;
|
||||||
|
Loading…
Reference in New Issue
Block a user