#include "lib.h"
#include "istream.h"
#include "file-lock.h"
+#include "file-dotlock.h"
#include "time-util.h"
#include <time.h>
struct file_lock {
int fd;
char *path;
+ struct dotlock *dotlock;
struct timeval locked_time;
int lock_type;
lock->close_on_free = set;
}
+struct file_lock *file_lock_from_dotlock(struct dotlock **dotlock)
+{
+ struct file_lock *lock;
+
+ lock = i_new(struct file_lock, 1);
+ lock->fd = -1;
+ lock->path = i_strdup(file_dotlock_get_lock_path(*dotlock));
+ lock->lock_type = F_WRLCK;
+ lock->lock_method = FILE_LOCK_METHOD_DOTLOCK;
+ if (gettimeofday(&lock->locked_time, NULL) < 0)
+ i_fatal("gettimeofday() failed: %m");
+ lock->dotlock = *dotlock;
+
+ *dotlock = NULL;
+ return lock;
+}
+
static void file_unlock_real(struct file_lock *lock)
{
const char *error;
could be deleting the new lock. */
i_assert(!lock->unlink_on_free);
- file_unlock_real(lock);
+ if (lock->dotlock == NULL)
+ file_unlock_real(lock);
file_lock_free(&lock);
}
*_lock = NULL;
+ if (lock->dotlock != NULL)
+ file_dotlock_delete(&lock->dotlock);
if (lock->unlink_on_free)
file_try_unlink_locked(lock);
if (lock->close_on_free)
#define DEFAULT_LOCK_TIMEOUT 120
struct file_lock;
+struct dotlock;
enum file_lock_method {
FILE_LOCK_METHOD_FCNTL,
be useful for files that are only created to exist as lock files. */
void file_lock_set_close_on_free(struct file_lock *lock, bool set);
+/* Convert dotlock into file_lock, which can be deleted with either
+ file_unlock() or file_lock_free(). */
+struct file_lock *file_lock_from_dotlock(struct dotlock **dotlock);
+
/* Unlock and free the lock. */
void file_unlock(struct file_lock **lock);
/* Free the lock without unlocking it (because you're closing the fd anyway). */