dovecot-1.1: Maildir + LAYOUT=fs: Return children flags correctly.

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 15 18:22:12 EET 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/b3ed691fcc3f
changeset: 8002:b3ed691fcc3f
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 15 18:21:58 2008 +0200
description:
Maildir + LAYOUT=fs: Return children flags correctly.

diffstat:

1 file changed, 33 insertions(+), 13 deletions(-)
src/lib-storage/index/maildir/maildir-storage.c |   46 ++++++++++++++++-------

diffs (72 lines):

diff -r 838034a9f369 -r b3ed691fcc3f src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Sat Nov 15 18:08:07 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sat Nov 15 18:21:58 2008 +0200
@@ -885,8 +885,8 @@ maildir_list_iter_is_mailbox(struct mail
 			     enum mailbox_list_file_type type,
 			     enum mailbox_info_flags *flags)
 {
-	struct stat st;
-	const char *path;
+	struct stat st, st2;
+	const char *path, *cur_path;
 
 	if (maildir_is_internal_name(fname)) {
 		*flags |= MAILBOX_NONEXISTENT;
@@ -908,26 +908,46 @@ maildir_list_iter_is_mailbox(struct mail
 
 	path = t_strdup_printf("%s/%s", dir, fname);
 	if (stat(path, &st) == 0) {
-		if (S_ISDIR(st.st_mode))
-			return 1;
-		else if (strncmp(fname, ".nfs", 4) == 0) {
-			/* temporary NFS file */
-			*flags |= MAILBOX_NONEXISTENT;
-			return 0;
-		} else {
-			*flags |= MAILBOX_NOSELECT;
+		if (!S_ISDIR(st.st_mode)) {
+			if (strncmp(fname, ".nfs", 4) == 0) {
+				/* temporary NFS file */
+				*flags |= MAILBOX_NONEXISTENT;
+			} else {
+				*flags |= MAILBOX_NOSELECT |
+					MAILBOX_NOINFERIORS;
+			}
 			return 0;
 		}
 	} else if (errno == ENOENT) {
 		/* doesn't exist - probably a non-existing subscribed mailbox */
 		*flags |= MAILBOX_NONEXISTENT;
-		return 1;
 	} else {
 		/* non-selectable. probably either access denied, or symlink
 		   destination not found. don't bother logging errors. */
 		*flags |= MAILBOX_NOSELECT;
-		return 0;
-	}
+	}
+	if ((*flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) == 0) {
+		/* make sure it's a selectable mailbox */
+		cur_path = t_strconcat(path, "/cur", NULL);
+		if (stat(cur_path, &st2) < 0 || !S_ISDIR(st2.st_mode))
+			*flags |= MAILBOX_NOSELECT;
+
+		/* now we can figure out based on the link count if we have
+		   child mailboxes or not. for a selectable mailbox we have
+		   3 more links (cur/, new/ and tmp/) than non-selectable. */
+		if ((*flags & MAILBOX_NOSELECT) == 0) {
+			if (st.st_nlink > 5)
+				*flags |= MAILBOX_CHILDREN;
+			else
+				*flags |= MAILBOX_NOCHILDREN;
+		} else {
+			if (st.st_nlink > 2)
+				*flags |= MAILBOX_CHILDREN;
+			else
+				*flags |= MAILBOX_NOCHILDREN;
+		}
+	}
+	return 1;
 }
 
 static int


More information about the dovecot-cvs mailing list