#define UIDLIST_IS_LOCKED(uidlist) \
((uidlist)->lock_count > 0)
-#define UIDLIST_ALLOW_WRITING(uidlist) \
- (UIDLIST_IS_LOCKED(uidlist) || (uidlist)->mbox == NULL)
struct maildir_uidlist_rec {
uint32_t uid;
ARRAY_DEFINE_TYPE(maildir_uidlist_rec_p, struct maildir_uidlist_rec *);
struct maildir_uidlist {
- struct maildir_mailbox *mbox;
+ struct mailbox *box;
char *path;
+ struct maildir_index_header *mhdr;
int fd;
dev_t fd_dev;
bool nonblock, bool refresh,
bool refresh_when_locked)
{
- struct mailbox *box = &uidlist->mbox->box;
+ struct mailbox *box = uidlist->box;
const char *control_dir, *path;
mode_t old_mask;
const enum dotlock_create_flags dotlock_flags =
return 1;
}
- index_storage_lock_notify_reset(&uidlist->mbox->box);
+ index_storage_lock_notify_reset(uidlist->box);
control_dir = mailbox_list_get_path(box->list, box->name,
MAILBOX_LIST_PATH_TYPE_CONTROL);
MAIL_ERROR_TEMP, MAIL_ERRSTR_LOCK_TIMEOUT);
return 0;
}
- if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT ||
- uidlist->mbox == NULL) {
+ if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) {
if (errno == EACCES) {
mail_storage_set_critical(box->storage, "%s",
eacces_error_get_creating("file_dotlock_create", path));
}
/* the control dir doesn't exist. create it unless the whole
mailbox was just deleted. */
- if (!maildir_set_deleted(&uidlist->mbox->box))
+ if (!maildir_set_deleted(uidlist->box))
return -1;
}
struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox)
{
+ struct mailbox *box = &mbox->box;
struct maildir_uidlist *uidlist;
const char *control_dir;
- control_dir = mailbox_list_get_path(mbox->box.list, mbox->box.name,
+ control_dir = mailbox_list_get_path(box->list, box->name,
MAILBOX_LIST_PATH_TYPE_CONTROL);
uidlist = i_new(struct maildir_uidlist, 1);
- uidlist->mbox = mbox;
+ uidlist->box = box;
+ uidlist->mhdr = &mbox->maildir_hdr;
uidlist->fd = -1;
uidlist->path = i_strconcat(control_dir, "/"MAILDIR_UIDLIST_NAME, NULL);
i_array_init(&uidlist->records, 128);
uidlist->dotlock_settings.use_io_notify = TRUE;
uidlist->dotlock_settings.use_excl_lock =
- mbox->box.storage->set->dotlock_use_excl;
+ box->storage->set->dotlock_use_excl;
uidlist->dotlock_settings.nfs_flush =
- mbox->box.storage->set->mail_nfs_storage;
+ box->storage->set->mail_nfs_storage;
uidlist->dotlock_settings.timeout =
- mail_storage_get_lock_timeout(&mbox->storage->storage,
+ mail_storage_get_lock_timeout(box->storage,
MAILDIR_UIDLIST_LOCK_STALE_TIMEOUT + 2);
uidlist->dotlock_settings.stale_timeout =
MAILDIR_UIDLIST_LOCK_STALE_TIMEOUT;
uidlist->dotlock_settings.callback = dotlock_callback;
- uidlist->dotlock_settings.context = &mbox->box;
+ uidlist->dotlock_settings.context = box;
uidlist->dotlock_settings.temp_prefix = mbox->storage->temp_prefix;
return uidlist;
}
static void maildir_uidlist_close(struct maildir_uidlist *uidlist)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
if (uidlist->fd != -1) {
if (close(uidlist->fd) < 0) {
maildir_uidlist_set_corrupted(struct maildir_uidlist *uidlist,
const char *fmt, ...)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
va_list args;
va_start(args, fmt);
static void maildir_uidlist_update_hdr(struct maildir_uidlist *uidlist,
const struct stat *st)
{
- struct maildir_index_header *mhdr;
-
- if (uidlist->mbox == NULL) {
- /* dbox is using this */
- return;
- }
+ struct maildir_index_header *mhdr = uidlist->mhdr;
- mhdr = &uidlist->mbox->maildir_hdr;
if (mhdr->uidlist_mtime == 0 && uidlist->version != UIDLIST_VERSION) {
/* upgrading from older verson. don't update the
uidlist times until it uses the new format */
maildir_uidlist_update_read(struct maildir_uidlist *uidlist,
bool *retry_r, bool try_retry)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
const char *line;
uint32_t orig_next_uid, orig_uid_validity;
struct istream *input;
static int
maildir_uidlist_stat(struct maildir_uidlist *uidlist, struct stat *st_r)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
if (storage->set->mail_nfs_storage) {
nfs_flush_file_handle_cache(uidlist->path);
static int
maildir_uidlist_has_changed(struct maildir_uidlist *uidlist, bool *recreated_r)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
struct stat st;
int ret;
uidlist->fd = nfs_safe_open(uidlist->path, O_RDWR);
if (uidlist->fd == -1 && errno != ENOENT) {
- mail_storage_set_critical(uidlist->mbox->box.storage,
+ mail_storage_set_critical(uidlist->box->storage,
"open(%s) failed: %m", uidlist->path);
return -1;
}
int maildir_uidlist_refresh_fast_init(struct maildir_uidlist *uidlist)
{
- const struct maildir_index_header *mhdr = &uidlist->mbox->maildir_hdr;
- struct mail_index *index = uidlist->mbox->box.index;
+ const struct maildir_index_header *mhdr = uidlist->mhdr;
+ struct mail_index *index = uidlist->box->index;
struct mail_index_view *view;
const struct mail_index_header *hdr;
struct stat st;
{
const struct mail_index_header *hdr;
- if (uidlist->mbox->box.opened) {
- hdr = mail_index_get_header(uidlist->mbox->box.view);
+ if (uidlist->box->opened) {
+ hdr = mail_index_get_header(uidlist->box->view);
if (hdr->uid_validity != 0) {
uidlist->uid_validity = hdr->uid_validity;
return;
}
}
uidlist->uid_validity =
- maildir_get_uidvalidity_next(uidlist->mbox->box.list);
+ maildir_get_uidvalidity_next(uidlist->box->list);
}
static int maildir_uidlist_write_fd(struct maildir_uidlist *uidlist, int fd,
const char *path, unsigned int first_idx,
uoff_t *file_size_r)
{
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
struct maildir_uidlist_iter_ctx *iter;
struct ostream *output;
struct maildir_uidlist_rec *rec;
/* we could get here when opening and locking mailbox,
before index files have been opened. */
- if (!uidlist->mbox->box.opened)
+ if (!uidlist->box->opened)
return;
- mail_index_refresh(uidlist->mbox->box.index);
- view = mail_index_view_open(uidlist->mbox->box.index);
+ mail_index_refresh(uidlist->box->index);
+ view = mail_index_view_open(uidlist->box->index);
count = array_count(&uidlist->records);
hdr = mail_index_get_header(view);
if (count * UIDLIST_COMPRESS_PERCENTAGE / 100 <= hdr->messages_count) {
static int maildir_uidlist_recreate(struct maildir_uidlist *uidlist)
{
- struct mailbox *box = &uidlist->mbox->box;
+ struct mailbox *box = uidlist->box;
const char *control_dir, *temp_path;
struct stat st;
mode_t old_mask;
if (fd != -1)
break;
- if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT ||
- uidlist->mbox == NULL) {
+ if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) {
mail_storage_set_critical(box->storage,
"open(%s, O_CREAT) failed: %m", temp_path);
return -1;
}
/* the control dir doesn't exist. create it unless the whole
mailbox was just deleted. */
- if (!maildir_set_deleted(&uidlist->mbox->box))
+ if (!maildir_set_deleted(uidlist->box))
return -1;
}
static int maildir_uidlist_sync_update(struct maildir_uidlist_sync_ctx *ctx)
{
struct maildir_uidlist *uidlist = ctx->uidlist;
- struct mail_storage *storage = uidlist->mbox->box.storage;
+ struct mail_storage *storage = uidlist->box->storage;
struct stat st;
uoff_t file_size;
*sync_ctx_r = ctx = i_new(struct maildir_uidlist_sync_ctx, 1);
ctx->uidlist = uidlist;
ctx->sync_flags = sync_flags;
- ctx->partial = (!locked && ctx->uidlist->mbox != NULL) ||
+ ctx->partial = !locked ||
(sync_flags & MAILDIR_UIDLIST_SYNC_PARTIAL) != 0;
ctx->locked = locked;
ctx->first_unwritten_pos = (unsigned int)-1;
}
if (uid != 0) {
if (rec->uid != uid && rec->uid != (uint32_t)-1) {
- mail_storage_set_critical(uidlist->mbox->box.storage,
+ mail_storage_set_critical(uidlist->box->storage,
"Maildir: %s changed UID %u -> %u",
filename, rec->uid, uid);
return -1;
return -1;
for (p = filename; *p != '\0'; p++) {
if (*p == 13 || *p == 10) {
- struct mailbox *box = &uidlist->mbox->box;
+ struct mailbox *box = uidlist->box;
dir = mailbox_list_get_path(box->list, box->name,
MAILBOX_LIST_PATH_TYPE_MAILBOX);
MAILDIR_UIDLIST_REC_FLAG_MOVED);
} else {
old_rec = hash_table_lookup(uidlist->files, filename);
- i_assert(old_rec != NULL || UIDLIST_ALLOW_WRITING(uidlist));
+ i_assert(old_rec != NULL || UIDLIST_IS_LOCKED(uidlist));
rec = p_new(ctx->record_pool, struct maildir_uidlist_rec, 1);
struct maildir_uidlist_rec **recs;
unsigned int dest, count;
- i_assert(UIDLIST_ALLOW_WRITING(ctx->uidlist));
+ i_assert(UIDLIST_IS_LOCKED(ctx->uidlist));
i_assert(ctx->first_new_pos != (unsigned int)-1);
if (ctx->first_unwritten_pos == (unsigned int)-1)
/* mbox=NULL means we're coming from dbox rebuilding code.
the dbox is already locked, so allow uidlist recreation */
- i_assert(ctx->locked || !ctx->changed || ctx->uidlist->mbox == NULL);
+ i_assert(ctx->locked || !ctx->changed);
if ((ctx->changed || maildir_uidlist_want_compress(ctx)) &&
- !ctx->failed && (ctx->locked || ctx->uidlist->mbox == NULL)) {
+ !ctx->failed && ctx->locked) {
T_BEGIN {
if (maildir_uidlist_sync_update(ctx) < 0) {
/* we couldn't write everything we wanted. make