file-lock.c revision 8c8f7ac580b661aee3d8b8dd37df4a9b41c77000
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenbool file_lock_method_parse(const char *name, enum file_lock_method *method_r)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenconst char *file_lock_method_to_str(enum file_lock_method method)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return "fcntl";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return "flock";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return "dotlock";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenint file_try_lock(int fd, const char *path, int lock_type,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen return file_wait_lock(fd, path, lock_type, lock_method, 0, lock_r);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic int file_lock_do(int fd, const char *path, int lock_type,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = fcntl(fd, timeout_secs ? F_SETLKW : F_SETLK, &fl);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* locked by another process */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* most likely alarm hit, meaning we timeouted.
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen even if not, we probably want to be killed
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen so stop blocking. */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen "File is locked by another process (EACCES)";
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen i_error("fcntl(%s) locking failed for file %s: %s",
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen lock_type == F_RDLCK ? "read-lock" : "write-lock",
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen int operation = timeout_secs != 0 ? 0 : LOCK_NB;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* a) locked by another process,
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen b) timeouted */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_error("flock(%s) locking failed for file %s: %m",
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen lock_type == F_RDLCK ? "read-lock" : "write-lock",
1554bed8d2b4e4286c10f7d6bcf716b246bd5bafTimo Sirainen /* we shouldn't get here */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenint file_wait_lock(int fd, const char *path, int lock_type,
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen ret = file_lock_do(fd, path, lock_type, lock_method, timeout_secs);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenint file_lock_try_update(struct file_lock *lock, int lock_type)