Implement -o for flock(1) to close fd before exec

This commit is contained in:
sin 2015-10-08 16:43:09 +01:00
parent 09c3caa56d
commit 7b9988c7ff
2 changed files with 11 additions and 3 deletions

View File

@ -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

View File

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