diff options
author | eadler <eadler@FreeBSD.org> | 2013-05-10 17:30:29 +0000 |
---|---|---|
committer | eadler <eadler@FreeBSD.org> | 2013-05-10 17:30:29 +0000 |
commit | 93bce4ba3b34db4666285290a2ef7d5a81ca1d67 (patch) | |
tree | 3215ec167a42e6a41f9e137da3c2b56c442d8545 | |
parent | 4f9ab6c5808469c9ba3259a28f51ce27809db72d (diff) | |
download | FreeBSD-src-93bce4ba3b34db4666285290a2ef7d5a81ca1d67.zip FreeBSD-src-93bce4ba3b34db4666285290a2ef7d5a81ca1d67.tar.gz |
Add option to lockf to avoid creating a file if it does not exist.
PR: bin/170775
Submitted by: Matthew Story <matthewstory@gmail.com>
Reviewed by: scottl
MFC after: 1 week
-rw-r--r-- | usr.bin/lockf/lockf.1 | 18 | ||||
-rw-r--r-- | usr.bin/lockf/lockf.c | 18 |
2 files changed, 28 insertions, 8 deletions
diff --git a/usr.bin/lockf/lockf.1 b/usr.bin/lockf/lockf.1 index f3ad6df..be9d9cc 100644 --- a/usr.bin/lockf/lockf.1 +++ b/usr.bin/lockf/lockf.1 @@ -32,7 +32,7 @@ .Nd execute a command while holding a file lock .Sh SYNOPSIS .Nm -.Op Fl ks +.Op Fl kns .Op Fl t Ar seconds .Ar file .Ar command @@ -90,6 +90,18 @@ Causes .Nm to operate silently. Failure to acquire the lock is indicated only in the exit status. +.It Fl n +Causes +.Nm +to fail if the specified lock +.Ar file +does not exist. If +.Fl n +is not specified, +.Nm +will create +.Ar file +if necessary. .It Fl t Ar seconds Specifies a timeout for waiting for the lock. By default, @@ -130,6 +142,10 @@ The utility was unable to create the lock file, e.g., because of insufficient access privileges. +.It Dv EX_UNAVAILABLE +The +.Fl n +option is specified and the specified lock file does not exist. .It Dv EX_USAGE There was an error on the .Nm diff --git a/usr.bin/lockf/lockf.c b/usr.bin/lockf/lockf.c index 368eed0..9a6141f 100644 --- a/usr.bin/lockf/lockf.c +++ b/usr.bin/lockf/lockf.c @@ -56,16 +56,20 @@ static volatile sig_atomic_t timed_out; int main(int argc, char **argv) { - int ch, silent, status, waitsec; + int ch, flags, silent, status, waitsec; pid_t child; silent = keep = 0; + flags = O_CREAT; waitsec = -1; /* Infinite. */ - while ((ch = getopt(argc, argv, "skt:")) != -1) { + while ((ch = getopt(argc, argv, "sknt:")) != -1) { switch (ch) { case 'k': keep = 1; break; + case 'n': + flags &= ~O_CREAT; + break; case 's': silent = 1; break; @@ -118,13 +122,13 @@ main(int argc, char **argv) * avoiding the separate step of waiting for the lock. This * yields fairness and improved performance. */ - lockfd = acquire_lock(lockname, O_NONBLOCK); + lockfd = acquire_lock(lockname, flags | O_NONBLOCK); while (lockfd == -1 && !timed_out && waitsec != 0) { if (keep) - lockfd = acquire_lock(lockname, 0); + lockfd = acquire_lock(lockname, flags); else { wait_for_lock(lockname); - lockfd = acquire_lock(lockname, O_NONBLOCK); + lockfd = acquire_lock(lockname, flags | O_NONBLOCK); } } if (waitsec > 0) @@ -165,7 +169,7 @@ acquire_lock(const char *name, int flags) { int fd; - if ((fd = open(name, O_RDONLY|O_CREAT|O_EXLOCK|flags, 0666)) == -1) { + if ((fd = open(name, flags|O_RDONLY|O_EXLOCK|flags, 0666)) == -1) { if (errno == EAGAIN || errno == EINTR) return (-1); err(EX_CANTCREAT, "cannot open %s", name); @@ -215,7 +219,7 @@ usage(void) { fprintf(stderr, - "usage: lockf [-ks] [-t seconds] file command [arguments]\n"); + "usage: lockf [-kns] [-t seconds] file command [arguments]\n"); exit(EX_USAGE); } |