mbox-lock.c revision 4780c036a0f52079068bd23e8a77b67ff457dba6
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen/* Copyright (c) 2002-2013 Dovecot authors, see the included COPYING file */
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen/* 0.1 .. 0.2msec */
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen#define LOCK_RANDOM_USLEEP_TIME (100000 + (unsigned int)rand() % 100000)
96f2533c48ce5def0004931606a2fdf275578880Timo Sirainen int (*func)(struct mbox_lock_context *ctx, int lock_type,
96f2533c48ce5def0004931606a2fdf275578880Timo Sirainenstatic int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
#ifdef HAVE_FLOCK
#ifdef HAVE_LOCKF
static int ATTR_NOWARN_UNUSED_RESULT
static int ATTR_NOWARN_UNUSED_RESULT
const char *const *lock;
int i, dest;
for (i = 0; i < dest; i++) {
return FALSE;
if (restrict_access_use_priv_gid() < 0) {
return FALSE;
return TRUE;
fname++;
if (restrict_access_use_priv_gid() < 0) {
switch (op) {
case MBOX_DOTLOCK_OP_LOCK:
if (ret > 0)
const char *errmsg =
fname);
case MBOX_DOTLOCK_OP_UNLOCK:
if (ret < 0)
case MBOX_DOTLOCK_OP_TOUCH:
if (ret < 0)
return ret;
int ret;
if (ret >= 0) {
if (ret < 0) {
if (ret == 0) {
#ifdef HAVE_FLOCK
unsigned int next_alarm;
if (max_wait_time == 0) {
alarm(0);
alarm(0);
if (next_alarm == 0)
alarm(0);
#ifdef HAVE_LOCKF
unsigned int next_alarm;
else if (max_wait_time == 0) {
max_wait_time == 0) {
alarm(0);
alarm(0);
if (next_alarm == 0)
alarm(0);
unsigned int next_alarm;
int wait_type;
if (max_wait_time == 0) {
alarm(0);
alarm(0);
if (next_alarm == 0)
alarm(0);
static int ATTR_NOWARN_UNUSED_RESULT
if (ret <= 0)
return ret;
bool *fcntl_locked_r)
int ret, i;
bool drop_locks;
for (i = 0; i < MBOX_LOCK_COUNT; i++)
if (ret <= 0) {
if (!drop_locks)
if (ret == 0) {
return ret;
if (drop_locks) {
unsigned int *lock_id_r)
bool fcntl_locked;
int ret;
if (ret <= 0)
return ret;
if (fcntl_locked) {
int ret = 0;
return ret;
bool fcntl_locked;
&fcntl_locked) < 0)
for (i = 0; i < MBOX_LOCK_COUNT; i++)