Skip to content

Commit

Permalink
lib-storage: Add mail_storage_lock_create()
Browse files Browse the repository at this point in the history
This is split off of mailbox_lock_file_create().
  • Loading branch information
sirainen authored and villesavolainen committed Feb 9, 2018
1 parent d2dd72d commit 369f9d5
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 12 deletions.
14 changes: 11 additions & 3 deletions src/lib-storage/mail-storage-private.h
Expand Up @@ -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"

Expand Down Expand Up @@ -818,10 +821,15 @@ bool mailbox_is_autocreated(struct mailbox *box);
/* 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);
Expand Down
27 changes: 18 additions & 9 deletions src/lib-storage/mail-storage.c
Expand Up @@ -2855,14 +2855,30 @@ void mail_set_mail_cache_corrupted(struct mail *mail, const char *fmt, ...)
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)
{
const struct mailbox_permissions *perm;
struct file_create_settings set;
const char *lock_path;
bool created;

perm = mailbox_get_permissions(box);
i_zero(&set);
Expand Down Expand Up @@ -2893,12 +2909,5 @@ int mailbox_lock_file_create(struct mailbox *box, const char *lock_fname,
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);
}

0 comments on commit 369f9d5

Please sign in to comment.