summaryrefslogtreecommitdiff
path: root/sys/src/cmd/lock.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-06-13 15:01:02 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-06-13 15:01:02 +0200
commit9c1dff3fa9928dd66114f3899d8ede99fad2cd53 (patch)
tree0e438fdf89dda02555bcf83e34e2beddbacd90b6 /sys/src/cmd/lock.c
parent1473e5d437e12c7312a859bcdfc167284ca99a4e (diff)
lock: reopen lockfile after changing mode to make lock effective
lock is acquired on open/create when file has DMEXCL set in mode, so we need to reopen the file after setting the bit with wstat.
Diffstat (limited to 'sys/src/cmd/lock.c')
-rw-r--r--sys/src/cmd/lock.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/src/cmd/lock.c b/sys/src/cmd/lock.c
index 1b2197f0d..27210259a 100644
--- a/sys/src/cmd/lock.c
+++ b/sys/src/cmd/lock.c
@@ -41,24 +41,28 @@ waitfor(int pid)
static int
openlock(char *lock)
{
- int lckfd;
+ int lckfd, didwstat = 0;
Dir *dir;
- if (lockwait)
- while ((lckfd = open(lock, ORDWR)) < 0)
- sleep(1000);
- else
- lckfd = open(lock, ORDWR);
+Reopen:
+ while ((lckfd = open(lock, ORDWR)) < 0 && lockwait)
+ sleep(1000);
if (lckfd < 0)
sysfatal("can't open %s read/write: %r", lock);
dir = dirfstat(lckfd);
if (dir == nil)
sysfatal("can't fstat %s: %r", lock);
if (!(dir->mode & DMEXCL)) {
+ if(didwstat++)
+ sysfatal("exclusive bit does not stick for %s", lock);
dir->mode |= DMEXCL;
dir->qid.type |= QTEXCL;
if (dirfwstat(lckfd, dir) < 0)
sysfatal("can't make %s exclusive access: %r", lock);
+ /* reopen for lock to be effective */
+ free(dir);
+ close(lckfd);
+ goto Reopen;
}
free(dir);
return lckfd;