97 |
l->dotlock = malloc(strlen(l->file) + 5 /*strlen(".lock")*/ + 1); |
l->dotlock = malloc(strlen(l->file) + 5 /*strlen(".lock")*/ + 1); |
98 |
|
|
99 |
if(!l->dotlock) |
if(!l->dotlock) |
100 |
{ |
{ |
101 |
free(l->file); |
free (l->file); |
102 |
free(l); |
free (l); |
103 |
return ENOMEM; |
return ENOMEM; |
104 |
} |
} |
105 |
|
|
106 |
sprintf(l->dotlock, "%s.lock", l->file); |
sprintf(l->dotlock, "%s.lock", l->file); |
107 |
|
|
108 |
if (flags) |
if (strcmp (filename, "/dev/null") == 0) |
109 |
|
l->flags = MU_LOCKER_NULL; |
110 |
|
else if (flags) |
111 |
l->flags = flags; |
l->flags = flags; |
112 |
else |
else |
113 |
l->flags = MU_LOCKER_DEFAULT; |
l->flags = MU_LOCKER_DEFAULT; |
346 |
if (lock == NULL) |
if (lock == NULL) |
347 |
return EINVAL; |
return EINVAL; |
348 |
|
|
349 |
INVARIANT (lock); |
if (lock->flags == MU_LOCKER_NULL) |
350 |
|
return 0; |
351 |
/* Is the lock already applied? */ |
|
352 |
|
INVARIANT (lock) |
353 |
|
/* Is the lock already applied? */ |
354 |
if (lock->refcnt > 0) |
if (lock->refcnt > 0) |
355 |
{ |
{ |
356 |
assert (lock->fd != -1); |
assert (lock->fd != -1); |
515 |
if (!lock) |
if (!lock) |
516 |
return MU_ERR_LOCKER_NULL; |
return MU_ERR_LOCKER_NULL; |
517 |
|
|
518 |
|
if (lock->flags == MU_LOCKER_NULL) |
519 |
|
return 0; |
520 |
|
|
521 |
assert(lock->dotlock); |
assert(lock->dotlock); |
522 |
|
|
523 |
INVARIANT(lock); |
INVARIANT(lock); |
531 |
int |
int |
532 |
locker_unlock (locker_t lock) |
locker_unlock (locker_t lock) |
533 |
{ |
{ |
534 |
|
if (!lock) |
535 |
|
return MU_ERR_LOCKER_NULL; |
536 |
|
|
537 |
|
if (lock->flags == MU_LOCKER_NULL) |
538 |
|
return 0; |
539 |
|
|
540 |
assert(lock->refcnt >= 0); |
assert(lock->refcnt >= 0); |
541 |
|
|
542 |
if (!lock) |
if (!lock) |
562 |
|
|
563 |
return 0; |
return 0; |
564 |
} |
} |
565 |
|
|
566 |
int |
int |
567 |
locker_remove_lock (locker_t lock) |
locker_remove_lock (locker_t lock) |
568 |
{ |
{ |
571 |
if (!lock) |
if (!lock) |
572 |
return MU_ERR_LOCKER_NULL; |
return MU_ERR_LOCKER_NULL; |
573 |
|
|
574 |
|
if (lock->flags == MU_LOCKER_NULL) |
575 |
|
return 0; |
576 |
|
|
577 |
INVARIANT(lock); |
INVARIANT(lock); |
578 |
|
|
579 |
/* If we hold the lock, do an unlock... */ |
/* If we hold the lock, do an unlock... */ |
580 |
if(lock->refcnt > 0) |
if(lock->refcnt > 0) |
581 |
{ |
{ |
582 |
/* Force the reference count to 1 to unlock the file. */ |
/* Force the reference count to 1 to unlock the file. */ |
583 |
lock->refcnt = 1; |
lock->refcnt = 1; |
584 |
return locker_unlock(lock); |
return locker_unlock(lock); |
585 |
} |
} |
586 |
|
|
587 |
/* ... if we don't, unlink the lockfile. */ |
/* ... if we don't, unlink the lockfile. */ |
588 |
err = unlink (lock->dotlock); |
err = unlink (lock->dotlock); |
589 |
|
|
590 |
if(err == -1) |
if(err == -1) |
591 |
{ |
{ |
592 |
err = errno; |
err = errno; |
593 |
|
|
594 |
if(err == ENOENT) |
if(err == ENOENT) |
595 |
err = MU_ERR_LOCK_NOT_HELD; |
err = MU_ERR_LOCK_NOT_HELD; |
596 |
} |
} |
597 |
|
|
598 |
INVARIANT(lock); |
INVARIANT(lock); |
599 |
|
|