file-dotlock.h revision 6cb2c6ecddcdbeac9e6c73a292244747e12a793e
#ifndef FILE_DOTLOCK_H
#define FILE_DOTLOCK_H
#include <unistd.h>
#include <fcntl.h>
struct dotlock;
struct dotlock_settings {
/* Dotlock files are created by first creating a temp file and then
link()ing it to the dotlock. temp_prefix specifies the prefix to
use for temp files. It may contain a full path. Default is
".temp.hostname.pid.". */
const char *temp_prefix;
/* Use this suffix for dotlock filenames. Default is ".lock". */
const char *lock_suffix;
/* Abort after this many seconds. */
unsigned int timeout;
/* Override the lock file when it and the file we're protecting is
older than stale_timeout. */
unsigned int stale_timeout;
/* Callback is called once in a while. stale is set to TRUE if stale
lock is detected and will be overridden in secs_left. If callback
returns FALSE then, the lock will not be overridden. */
void *context;
/* Rely on O_EXCL locking to work instead of using hardlinks.
It's faster, but doesn't work with all NFS implementations. */
unsigned int use_excl_lock:1;
/* Flush NFS attribute cache before stating files. */
unsigned int nfs_flush:1;
/* Use io_add_notify() to speed up finding out when an existing
dotlock is deleted */
unsigned int use_io_notify:1;
};
enum dotlock_create_flags {
/* If lock already exists, fail immediately */
DOTLOCK_CREATE_FLAG_NONBLOCK = 0x01,
/* Don't actually create the lock file, only make sure it doesn't
exist. This is racy, so you shouldn't rely on it much. */
};
enum dotlock_replace_flags {
/* Check that lock file hasn't been overridden before renaming. */
/* Don't close the file descriptor. */
};
/* Create dotlock. Returns 1 if successful, 0 if timeout or -1 if error.
When returning 0, errno is also set to EAGAIN. */
enum dotlock_create_flags flags,
/* Delete the dotlock file, ignoring any potential errors. */
/* Delete the dotlock file. Returns 1 if successful, 0 if the file had already
been deleted or reused by someone else, -1 if I/O error. */
/* Use dotlock as the new content for file. This provides read safety without
locks, but it's not very good for large files. Returns fd for lock file.
If locking timed out, returns -1 and errno = EAGAIN. */
enum dotlock_create_flags flags,
/* Like file_dotlock_open(), but use the given file permissions. */
enum dotlock_create_flags flags,
enum dotlock_create_flags flags,
/* Replaces the file dotlock protects with the dotlock file itself. */
enum dotlock_replace_flags flags);
/* Update dotlock's mtime. If you're keeping the dotlock for a long time,
it's a good idea to update it once in a while so others won't override it.
If the timestamp is less than a second old, it's not updated. */
/* Returns TRUE if the lock is still ok, FALSE if it's been overridden. */
/* Returns the lock file path. */
#endif