commit 7b9988c7fffa6a3d44270401246079e77af14614
Author:     sin <[email protected]>
AuthorDate: Thu Oct 8 16:43:09 2015 +0100
Commit:     sin <[email protected]>
CommitDate: Mon Oct 26 11:55:41 2015 +0000

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

diff --git a/flock.1 b/flock.1
index 9632a10..84a0098 100644
--- 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
index 112ce4a..292821f 100644
--- 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;

Reply via email to