commit 7b9988c7fffa6a3d44270401246079e77af14614
parent 09c3caa56d51f42ed37e5da90757f257eb23e311
Author: sin <sin@2f30.org>
Date: Thu, 8 Oct 2015 16:43:09 +0100
Implement -o for flock(1) to close fd before exec
Diffstat:
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/flock.1 b/flock.1
@@ -6,7 +6,7 @@
.Nd tool to manage locks on files
.Sh SYNOPSIS
.Nm
-.Op Fl nsux
+.Op Fl nosux
.Ar file
.Ar cmd Op arg ...
.Sh DESCRIPTION
@@ -20,6 +20,9 @@ does not exist, it will be created.
.It Fl n
Set non-blocking mode on the lock. Fail immediately if the lock
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
Acquire a shared lock.
.It Fl u
diff --git a/flock.c b/flock.c
@@ -12,19 +12,22 @@
static void
usage(void)
{
- eprintf("usage: %s [-nsux] file cmd [arg ...]\n", argv0);
+ eprintf("usage: %s [-nosux] file cmd [arg ...]\n", argv0);
}
int
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;
ARGBEGIN {
case 'n':
nonblk = LOCK_NB;
break;
+ case 'o':
+ oflag = 1;
+ break;
case 's':
flags = LOCK_SH;
break;
@@ -54,6 +57,8 @@ main(int argc, char *argv[])
case -1:
eprintf("fork:");
case 0:
+ if (oflag && close(fd) < 0)
+ eprintf("close:");
argv++;
execvp(*argv, argv);
savederrno = errno;