sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

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:
Mflock.1 | 5++++-
Mflock.c | 9+++++++--
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;