From 7b9988c7fffa6a3d44270401246079e77af14614 Mon Sep 17 00:00:00 2001 From: sin Date: Thu, 8 Oct 2015 16:43:09 +0100 Subject: [PATCH] Implement -o for flock(1) to close fd before exec --- flock.1 | 5 ++++- flock.c | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) 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;