file-lock.h revision c25356d5978632df6203437e1953bcb29e0c736f
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef FILE_LOCK_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define FILE_LOCK_H
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen#include <unistd.h>
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen#include <fcntl.h>
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen
9e86ad9eb313004cd4c8b5427daeb4c241b57af6Timo Sirainen#define DEFAULT_LOCK_TIMEOUT 120
9e86ad9eb313004cd4c8b5427daeb4c241b57af6Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenstruct file_lock;
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenenum file_lock_method {
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen FILE_LOCK_METHOD_FCNTL,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen FILE_LOCK_METHOD_FLOCK,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen FILE_LOCK_METHOD_DOTLOCK
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen};
c2bb1764c359ce85a7f7f789ead11dd613ff9769Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen/* Lock the file. Returns 1 if successful, 0 if file is already locked,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen or -1 if error. lock_type is F_WRLCK or F_RDLCK. */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenint file_try_lock(int fd, const char *path, int lock_type,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen enum file_lock_method lock_method,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen struct file_lock **lock_r);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen/* Like lock_try_lock(), but return 0 only after having tried to lock for
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen timeout_secs. */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenint file_wait_lock(int fd, const char *path, int lock_type,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen enum file_lock_method lock_method,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen unsigned int timeout_secs,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen struct file_lock **lock_r);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen/* Change the lock type. */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenint file_lock_try_update(struct file_lock *lock, int lock_type);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen/* Unlock and free the lock. */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenvoid file_unlock(struct file_lock **lock);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen/* Free the lock without unlocking it (because you're closing the fd anyway). */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenvoid file_lock_free(struct file_lock **lock);
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen#endif