dovecot-1.2: Maildir + LAYOUT=fs: Return children flags correctly.
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 15 18:22:09 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/83cfa6204784
changeset: 8397:83cfa6204784
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 15 18:22:06 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 8b8a424ed82e -r 83cfa6204784 src/lib-storage/index/maildir/maildir-storage.c
--- 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 @@ 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;
@@ -906,26 +906,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