changeset 8397:83cfa6204784 HEAD

Maildir + LAYOUT=fs: Return children flags correctly.
author Timo Sirainen <tss@iki.fi>
date Sat, 15 Nov 2008 18:22:06 +0200
parents 8b8a424ed82e
children d331b8fc8ba8
files src/lib-storage/index/maildir/maildir-storage.c
diffstat 1 files changed, 32 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-storage.c	Sat Nov 15 18:07:48 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sat Nov 15 18:22:06 2008 +0200
@@ -883,8 +883,8 @@
 			     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;
@@ -906,26 +906,46 @@
 
 	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