changeset 12631:7701fb66d82a

maildir: Avoid stat()ing dovecot-shared unnecessarily.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Feb 2011 21:07:27 +0200
parents 82f984d7a241
children 2c599f0eab69
files src/lib-storage/index/maildir/maildir-storage.c
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-storage.c	Tue Feb 01 20:59:21 2011 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Tue Feb 01 21:07:27 2011 +0200
@@ -595,14 +595,24 @@
 static enum mail_flags maildir_get_private_flags_mask(struct mailbox *box)
 {
 	struct maildir_mailbox *mbox = (struct maildir_mailbox *)box;
-	const char *path;
+	const char *path, *path2;
 	struct stat st;
 
-	if (!mbox->private_flags_mask_set) {
-		path = t_strconcat(mailbox_get_path(box), "/dovecot-shared", NULL);
-		if (stat(path, &st) < 0)
-			mbox->_private_flags_mask = 0;
-		else
+	if (mbox->private_flags_mask_set)
+		return mbox->_private_flags_mask;
+	mbox->private_flags_mask_set = TRUE;
+
+	path = mailbox_list_get_path(box->list, NULL,
+				     MAILBOX_LIST_PATH_TYPE_MAILBOX);
+	path2 = mailbox_list_get_path(box->list, NULL,
+				      MAILBOX_LIST_PATH_TYPE_INDEX);
+	if (strcmp(path, path2) == 0) {
+		/* no separate index directory. we can't have private flags,
+		   so don't even bother checking if dovecot-shared exists */
+	} else {
+		path = t_strconcat(mailbox_get_path(box),
+				   "/dovecot-shared", NULL);
+		if (stat(path, &st) == 0)
 			mbox->_private_flags_mask = MAIL_SEEN;
 	}
 	return mbox->_private_flags_mask;