file-dotlock.c revision fb453e6ba70f848f975c34d030481edb7832609b
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* 0.1 .. 0.2msec */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#define LOCK_RANDOM_USLEEP_TIME (100000 + (unsigned int)rand() % 100000)
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen/* Maximum 3 second wait between dotlock checks */
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen/* If the dotlock is newer than this, don't verify that the PID it contains
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen is valid (since it most likely is). */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Maximum difference between current time and create file's ctime before
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen logging a warning. Should be less than a second in normal operation. */
e6bdf53eb0143af99e3eb977ff0f8a496ecd1a8dTimo Sirainenstatic struct dotlock *
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenfile_dotlock_alloc(const struct dotlock_settings *settings, const char *path)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen dotlock->settings.lock_suffix = DEFAULT_LOCK_SUFFIX;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenstatic pid_t read_local_pid(const char *lock_path)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* read line */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* fix the string */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* it should contain pid:host */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* host must be ours */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenupdate_change_info(const struct stat *st, struct file_change_info *change,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen time_t *last_change_r, time_t now, bool check_ctime)
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen /* ctime is checked only if we're not doing NFS attribute cache
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen flushes. it changes them. */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen if (change->ino != st->st_ino || !CMP_DEV_T(change->dev, st->st_dev) ||
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen (change->ctime != st->st_ctime && check_ctime) ||
return TRUE;
return FALSE;
bool *changed_r)
bool changed;
int ret;
return ret;
return ret;
if (!changed) {
if (stale_timeout == 0) {
const char *str;
if (p != NULL) {
if (write_pid) {
int fd;
if (write_pid) {
case IO_NOTIFY_ADDED:
case IO_NOTIFY_NOTFOUND:
case IO_NOTIFY_NOSUPPORT:
const char *lock_path;
unsigned int stale_notify_threshold;
int ret;
bool do_wait;
if (do_wait) {
if (ret < 0)
tmp_path);
if (ret != 0)
unsigned int secs_left =
} else if (wait_left > 0) {
if (ret > 0) {
if (ret == 0)
return ret;
int old_errno;
const char *lock_path;
return ret;
int ret;
T_BEGIN {
} T_END;
return ret;
const char *lock_path;
const char *lock_path;
int ret;
T_BEGIN {
const char *lock_path;
} T_END;
if (ret <= 0) {
int fd;
return fd;
const char *lock_path;
int ret = 0;
T_BEGIN {
} T_END;
return ret;
const char *lock_path;
return FALSE;
return FALSE;