dovecot: Added maildir_uidlist_init_readonly() and maildir_uidli...

dovecot at dovecot.org dovecot at dovecot.org
Sun Oct 21 18:58:04 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/a6f51026b969
changeset: 6599:a6f51026b969
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Oct 21 18:54:32 2007 +0300
description:
Added maildir_uidlist_init_readonly() and maildir_uidlist_get_uid().

diffstat:

2 files changed, 73 insertions(+), 35 deletions(-)
src/lib-storage/index/maildir/maildir-uidlist.c |  102 +++++++++++++++--------
src/lib-storage/index/maildir/maildir-uidlist.h |    6 +

diffs (truncated from 301 to 300 lines):

diff -r 7eb8fd17f8c5 -r a6f51026b969 src/lib-storage/index/maildir/maildir-uidlist.c
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Oct 21 17:41:47 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sun Oct 21 18:54:32 2007 +0300
@@ -64,6 +64,7 @@ ARRAY_DEFINE_TYPE(maildir_uidlist_rec_p,
 
 struct maildir_uidlist {
 	struct maildir_mailbox *mbox;
+	struct index_mailbox *ibox;
 	char *path;
 
 	int fd;
@@ -123,8 +124,8 @@ static int maildir_uidlist_lock_timeout(
 static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
 					bool nonblock)
 {
-	struct maildir_mailbox *mbox = uidlist->mbox;
-	const char *path;
+	struct mailbox *box = &uidlist->ibox->box;
+	const char *control_dir, *path;
 	mode_t old_mask;
 	int ret;
 
@@ -133,19 +134,22 @@ static int maildir_uidlist_lock_timeout(
 		return 1;
 	}
 
-	path = t_strconcat(mbox->control_dir, "/" MAILDIR_UIDLIST_NAME, NULL);
-        old_mask = umask(0777 & ~mbox->ibox.box.file_create_mode);
+	control_dir = mailbox_list_get_path(box->storage->list, box->name,
+					    MAILBOX_LIST_PATH_TYPE_CONTROL);
+
+	path = t_strconcat(control_dir, "/" MAILDIR_UIDLIST_NAME, NULL);
+        old_mask = umask(0777 & ~box->file_create_mode);
 	ret = file_dotlock_create(&uidlist->dotlock_settings, path,
 				  nonblock ? DOTLOCK_CREATE_FLAG_NONBLOCK : 0,
 				  &uidlist->dotlock);
 	umask(old_mask);
 	if (ret <= 0) {
 		if (ret == 0) {
-			mail_storage_set_error(&mbox->storage->storage,
+			mail_storage_set_error(box->storage,
 				MAIL_ERROR_TEMP, MAIL_ERRSTR_LOCK_TIMEOUT);
 			return 0;
 		}
-		mail_storage_set_critical(&mbox->storage->storage,
+		mail_storage_set_critical(box->storage,
 			"file_dotlock_open(%s) failed: %m", path);
 		return -1;
 	}
@@ -192,15 +196,20 @@ void maildir_uidlist_unlock(struct maild
 	(void)file_dotlock_delete(&uidlist->dotlock);
 }
 
-struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox)
-{
+struct maildir_uidlist *
+maildir_uidlist_init_readonly(struct index_mailbox *ibox)
+{
+	struct mailbox *box = &ibox->box;
 	struct maildir_uidlist *uidlist;
+	const char *control_dir;
+
+	control_dir = mailbox_list_get_path(box->storage->list, box->name,
+					    MAILBOX_LIST_PATH_TYPE_CONTROL);
 
 	uidlist = i_new(struct maildir_uidlist, 1);
 	uidlist->fd = -1;
-	uidlist->mbox = mbox;
-	uidlist->path =
-		i_strconcat(mbox->control_dir, "/" MAILDIR_UIDLIST_NAME, NULL);
+	uidlist->ibox = ibox;
+	uidlist->path = i_strconcat(control_dir, "/"MAILDIR_UIDLIST_NAME, NULL);
 	i_array_init(&uidlist->records, 128);
 	uidlist->files = hash_create(default_pool, default_pool, 4096,
 				     maildir_filename_base_hash,
@@ -210,15 +219,23 @@ struct maildir_uidlist *maildir_uidlist_
 
 	uidlist->dotlock_settings.use_io_notify = TRUE;
 	uidlist->dotlock_settings.use_excl_lock =
-		(mbox->storage->storage.flags &
-		 MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0;
+		(box->storage->flags & MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0;
 	uidlist->dotlock_settings.nfs_flush =
-		(mbox->storage->storage.flags &
+		(box->storage->flags &
 		 MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0;
 	uidlist->dotlock_settings.timeout = UIDLIST_LOCK_STALE_TIMEOUT + 2;
 	uidlist->dotlock_settings.stale_timeout = UIDLIST_LOCK_STALE_TIMEOUT;
+
+	return uidlist;
+}
+
+struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox)
+{
+	struct maildir_uidlist *uidlist;
+
+	uidlist = maildir_uidlist_init_readonly(&mbox->ibox);
+	uidlist->mbox = mbox;
 	uidlist->dotlock_settings.temp_prefix = mbox->storage->temp_prefix;
-
 	return uidlist;
 }
 
@@ -313,7 +330,7 @@ static int maildir_uidlist_next(struct m
 static int maildir_uidlist_next(struct maildir_uidlist *uidlist,
 				const char *line)
 {
-	struct mail_storage *storage = &uidlist->mbox->storage->storage;
+	struct mail_storage *storage = uidlist->ibox->box.storage;
 	struct maildir_uidlist_rec *rec, *old_rec;
 	uint32_t uid;
 
@@ -387,7 +404,7 @@ static int maildir_uidlist_read_header(s
 static int maildir_uidlist_read_header(struct maildir_uidlist *uidlist,
 				       struct istream *input)
 {
-	struct mail_storage *storage = &uidlist->mbox->storage->storage;
+	struct mail_storage *storage = uidlist->ibox->box.storage;
 	unsigned int uid_validity, next_uid;
 	string_t *ext_hdr;
 	const char *line, *value;
@@ -475,7 +492,7 @@ maildir_uidlist_update_read(struct maild
 maildir_uidlist_update_read(struct maildir_uidlist *uidlist,
 			    bool *retry_r, bool try_retry)
 {
-	struct mail_storage *storage = &uidlist->mbox->storage->storage;
+	struct mail_storage *storage = uidlist->ibox->box.storage;
 	const char *line;
 	unsigned int orig_next_uid;
 	struct istream *input;
@@ -595,7 +612,7 @@ static int
 static int
 maildir_uidlist_has_changed(struct maildir_uidlist *uidlist, bool *recreated_r)
 {
-	struct mail_storage *storage = &uidlist->mbox->storage->storage;
+	struct mail_storage *storage = uidlist->ibox->box.storage;
         struct stat st;
 
 	*recreated_r = FALSE;
@@ -695,7 +712,7 @@ maildir_uidlist_lookup(struct maildir_ui
 
 	rec = maildir_uidlist_lookup_rec(uidlist, uid, &idx);
 	if (rec == NULL) {
-		if (uidlist->fd != -1)
+		if (uidlist->fd != -1 || uidlist->mbox == NULL)
 			return NULL;
 
 		/* the uidlist doesn't exist. */
@@ -802,7 +819,7 @@ static int maildir_uidlist_write_fd(stru
 				    const char *path, unsigned int first_idx,
 				    uoff_t *file_size_r)
 {
-	struct mail_storage *storage = &uidlist->mbox->storage->storage;
+	struct mail_storage *storage = uidlist->ibox->box.storage;
 	struct maildir_uidlist_iter_ctx *iter;
 	struct ostream *output;
 	struct maildir_uidlist_rec *rec;
@@ -831,7 +848,7 @@ static int maildir_uidlist_write_fd(stru
 		o_stream_send(output, str_data(str), str_len(str));
 	}
 
-	iter = maildir_uidlist_iter_init(uidlist->mbox->uidlist);
+	iter = maildir_uidlist_iter_init(uidlist);
 	iter->next += first_idx;
 
 	while (maildir_uidlist_iter_next_rec(iter, &rec)) {
@@ -862,7 +879,7 @@ static int maildir_uidlist_write_fd(stru
 		return -1;
 	}
 
-	if (!uidlist->mbox->ibox.fsync_disable) {
+	if (!uidlist->ibox->fsync_disable) {
 		if (fdatasync(fd) < 0) {
 			mail_storage_set_critical(storage,
 				"fsync(%s) failed: %m", path);
@@ -875,29 +892,31 @@ static int maildir_uidlist_write_fd(stru
 
 static int maildir_uidlist_recreate(struct maildir_uidlist *uidlist)
 {
-	struct maildir_mailbox *mbox = uidlist->mbox;
-	const char *temp_path;
+	struct mailbox *box = &uidlist->ibox->box;
+	const char *control_dir, *temp_path;
 	struct stat st;
 	mode_t old_mask;
 	uoff_t file_size;
 	int fd, ret;
 
-	temp_path = t_strconcat(mbox->control_dir,
+	control_dir = mailbox_list_get_path(box->storage->list, box->name,
+					    MAILBOX_LIST_PATH_TYPE_CONTROL);
+	temp_path = t_strconcat(control_dir,
 				"/" MAILDIR_UIDLIST_NAME ".tmp", NULL);
 
-	old_mask = umask(0777 & ~mbox->ibox.box.file_create_mode);
+	old_mask = umask(0777 & ~box->file_create_mode);
 	fd = open(temp_path, O_RDWR | O_CREAT | O_TRUNC, 0777);
 	umask(old_mask);
 
 	if (fd == -1) {
-		mail_storage_set_critical(&mbox->storage->storage,
+		mail_storage_set_critical(box->storage,
 			"open(%s, O_CREAT) failed: %m", temp_path);
 		return -1;
 	}
 
-	if (mbox->ibox.box.file_create_gid != (gid_t)-1) {
-		if (fchown(fd, (uid_t)-1, mbox->ibox.box.file_create_gid) < 0) {
-			mail_storage_set_critical(&mbox->storage->storage,
+	if (box->file_create_gid != (gid_t)-1) {
+		if (fchown(fd, (uid_t)-1, box->file_create_gid) < 0) {
+			mail_storage_set_critical(box->storage,
 				"fchown(%s) failed: %m", temp_path);
 		}
 	}
@@ -905,7 +924,7 @@ static int maildir_uidlist_recreate(stru
 	ret = maildir_uidlist_write_fd(uidlist, fd, temp_path, 0, &file_size);
 	if (ret == 0) {
 		if (rename(temp_path, uidlist->path) < 0) {
-			mail_storage_set_critical(&mbox->storage->storage,
+			mail_storage_set_critical(box->storage,
 				"rename(%s, %s) failed: %m",
 				temp_path, uidlist->path);
 			ret = -1;
@@ -914,7 +933,7 @@ static int maildir_uidlist_recreate(stru
 
 	if (ret < 0) {
 		if (unlink(temp_path) < 0) {
-			mail_storage_set_critical(&mbox->storage->storage,
+			mail_storage_set_critical(box->storage,
 				"unlink(%s) failed: %m", temp_path);
 		}
 	} else if (fstat(fd, &st) < 0) {
@@ -957,7 +976,7 @@ static int maildir_uidlist_sync_update(s
 		/* saving a message to a newly created maildir. */
 		const struct mail_index_header *hdr;
 
-		hdr = mail_index_get_header(uidlist->mbox->ibox.view);
+		hdr = mail_index_get_header(uidlist->ibox->view);
 		uidlist->uid_validity = hdr->uid_validity != 0 ?
 			hdr->uid_validity : (uint32_t)ioloop_time;
 	}
@@ -971,7 +990,7 @@ static int maildir_uidlist_sync_update(s
 	i_assert(ctx->first_unwritten_pos != (unsigned int)-1);
 
 	if (lseek(uidlist->fd, 0, SEEK_END) < 0) {
-		mail_storage_set_critical(&uidlist->mbox->storage->storage,
+		mail_storage_set_critical(uidlist->ibox->box.storage,
 			"lseek(%s) failed: %m", uidlist->path);
 		return -1;
 	}
@@ -1187,6 +1206,19 @@ maildir_uidlist_sync_get_full_filename(s
 	return rec == NULL ? NULL : rec->filename;
 }
 
+bool maildir_uidlist_get_uid(struct maildir_uidlist *uidlist,
+			     const char *filename, uint32_t *uid_r)
+{
+	struct maildir_uidlist_rec *rec;
+
+	rec = hash_lookup(uidlist->files, filename);
+	if (rec == NULL)
+		return FALSE;
+
+	*uid_r = rec->uid;
+	return TRUE;
+}
+
 const char *
 maildir_uidlist_get_full_filename(struct maildir_uidlist *uidlist,
 				  const char *filename)
diff -r 7eb8fd17f8c5 -r a6f51026b969 src/lib-storage/index/maildir/maildir-uidlist.h
--- a/src/lib-storage/index/maildir/maildir-uidlist.h	Sun Oct 21 17:41:47 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-uidlist.h	Sun Oct 21 18:54:32 2007 +0300
@@ -3,6 +3,8 @@
 
 #define MAILDIR_UIDLIST_NAME "dovecot-uidlist"
 
+struct maildir_mailbox;
+struct maildir_uidlist;
 struct maildir_uidlist_sync_ctx;
 
 enum maildir_uidlist_sync_flags {
@@ -40,6 +42,8 @@ bool maildir_uidlist_is_locked(struct ma
 bool maildir_uidlist_is_locked(struct maildir_uidlist *uidlist);
 
 struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox);
+struct maildir_uidlist *
+maildir_uidlist_init_readonly(struct index_mailbox *ibox);
 void maildir_uidlist_deinit(struct maildir_uidlist **uidlist);
 
 /* Returns -1 if error, 0 if file is broken or lost, 1 if ok. */
@@ -89,6 +93,8 @@ void maildir_uidlist_sync_finish(struct 
 void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx);
 int maildir_uidlist_sync_deinit(struct maildir_uidlist_sync_ctx **ctx);
 
+bool maildir_uidlist_get_uid(struct maildir_uidlist *uidlist,
+			     const char *filename, uint32_t *uid_r);
 const char *
 maildir_uidlist_get_full_filename(struct maildir_uidlist *uidlist,


More information about the dovecot-cvs mailing list