changeset 22817:ccd84e5bcf8c

lib-storage: Add mail_storage_lock_create() This is split off of mailbox_lock_file_create().
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 06 Feb 2018 17:47:37 +0200
parents d1debec5d1c1
children c4c14db5c639
files src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c
diffstat 2 files changed, 29 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-private.h	Tue Feb 06 17:35:18 2018 +0200
+++ b/src/lib-storage/mail-storage-private.h	Tue Feb 06 17:47:37 2018 +0200
@@ -10,6 +10,9 @@
 #include "mailbox-attribute-private.h"
 #include "mail-index-private.h"
 
+struct file_lock;
+struct file_create_settings;
+
 /* Default prefix for indexes */
 #define MAIL_INDEX_PREFIX "dovecot.index"
 
@@ -818,10 +821,15 @@
 /* Returns -1 if error, 0 if failed with EEXIST, 1 if ok */
 int mailbox_create_fd(struct mailbox *box, const char *path, int flags,
 		      int *fd_r);
-/* Create a lock file to the mailbox with the given filename. If it succeeds,
+/* Create a lock file with the given path and settings. If it succeeds,
    returns 1 and lock_r, which needs to be freed once finished with the lock.
-   If lock_secs is reached, returns 0 and error_r. Returns -1 and sets error_r
-   on other errors. */
+   If lock_set->lock_timeout_secs is reached, returns 0 and error_r. Returns
+   -1 and sets error_r on other errors. */
+int mail_storage_lock_create(const char *lock_path,
+			     const struct file_create_settings *lock_set,
+			     struct file_lock **lock_r, const char **error_r);
+/* Create a lock file to the mailbox with the given filename. Returns the same
+   as mail_storage_lock_create(). */
 int mailbox_lock_file_create(struct mailbox *box, const char *lock_fname,
 			     unsigned int lock_secs, struct file_lock **lock_r,
 			     const char **error_r);
--- a/src/lib-storage/mail-storage.c	Tue Feb 06 17:35:18 2018 +0200
+++ b/src/lib-storage/mail-storage.c	Tue Feb 06 17:47:37 2018 +0200
@@ -2855,6 +2855,23 @@
 	va_end(va);
 }
 
+int mail_storage_lock_create(const char *lock_path,
+			     const struct file_create_settings *lock_set,
+			     struct file_lock **lock_r, const char **error_r)
+{
+	bool created;
+
+	if (file_create_locked(lock_path, lock_set, lock_r,
+			       &created, error_r) == -1) {
+		*error_r = t_strdup_printf("file_create_locked(%s) failed: %s",
+					   lock_path, *error_r);
+		return errno == EAGAIN ? 0 : -1;
+	}
+	file_lock_set_close_on_free(*lock_r, TRUE);
+	file_lock_set_unlink_on_free(*lock_r, TRUE);
+	return 1;
+}
+
 int mailbox_lock_file_create(struct mailbox *box, const char *lock_fname,
 			     unsigned int lock_secs, struct file_lock **lock_r,
 			     const char **error_r)
@@ -2862,7 +2879,6 @@
 	const struct mailbox_permissions *perm;
 	struct file_create_settings set;
 	const char *lock_path;
-	bool created;
 
 	perm = mailbox_get_permissions(box);
 	i_zero(&set);
@@ -2893,12 +2909,5 @@
 		set.mkdir_mode = 0700;
 	}
 
-	if (file_create_locked(lock_path, &set, lock_r, &created, error_r) == -1) {
-		*error_r = t_strdup_printf("file_create_locked(%s) failed: %s",
-					   lock_path, *error_r);
-		return errno == EAGAIN ? 0 : -1;
-	}
-	file_lock_set_close_on_free(*lock_r, TRUE);
-	file_lock_set_unlink_on_free(*lock_r, TRUE);
-	return 1;
+	return mail_storage_lock_create(lock_path, &set, lock_r, error_r);
 }