dovecot-1.2: Maildir: LAYOUT=fs didn't return \NonExistent flag ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 15 17:57:43 EET 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/401d1d3f4eca
changeset: 8395:401d1d3f4eca
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 15 17:57:38 2008 +0200
description:
Maildir: LAYOUT=fs didn't return \NonExistent flag correctly.
Also made the *_iter_is_mailbox() handling consistent between backends.

diffstat:

2 files changed, 26 insertions(+), 24 deletions(-)
src/lib-storage/index/maildir/maildir-storage.c |   18 +++++++-----
src/lib-storage/index/mbox/mbox-storage.c       |   32 +++++++++++------------

diffs (144 lines):

diff -r 8be0fe79093b -r 401d1d3f4eca src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Thu Nov 13 12:05:54 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sat Nov 15 17:57:38 2008 +0200
@@ -881,13 +881,13 @@ maildir_list_iter_is_mailbox(struct mail
 			     const char *dir, const char *fname,
 			     const char *mailbox_name ATTR_UNUSED,
 			     enum mailbox_list_file_type type,
-			     enum mailbox_info_flags *flags_r)
+			     enum mailbox_info_flags *flags)
 {
 	struct stat st;
 	const char *path;
 
 	if (maildir_is_internal_name(fname)) {
-		*flags_r = MAILBOX_NONEXISTENT;
+		*flags |= MAILBOX_NONEXISTENT;
 		return 0;
 	}
 
@@ -895,7 +895,7 @@ maildir_list_iter_is_mailbox(struct mail
 	case MAILBOX_LIST_FILE_TYPE_FILE:
 	case MAILBOX_LIST_FILE_TYPE_OTHER:
 		/* non-directories are not */
-		*flags_r = MAILBOX_NOSELECT;
+		*flags |= MAILBOX_NOSELECT;
 		return 0;
 
 	case MAILBOX_LIST_FILE_TYPE_DIR:
@@ -910,18 +910,20 @@ maildir_list_iter_is_mailbox(struct mail
 			return 1;
 		else if (strncmp(fname, ".nfs", 4) == 0) {
 			/* temporary NFS file */
-			*flags_r = MAILBOX_NONEXISTENT;
+			*flags |= MAILBOX_NONEXISTENT;
 			return 0;
 		} else {
-			*flags_r = MAILBOX_NOSELECT;
+			*flags |= MAILBOX_NOSELECT;
 			return 0;
 		}
 	} else if (errno == ENOENT) {
-		/* this was a directory. maybe it has children. */
-		*flags_r = MAILBOX_NOSELECT;
+		/* doesn't exist - probably a non-existing subscribed mailbox */
+		*flags |= MAILBOX_NONEXISTENT;
 		return 1;
 	} else {
-		*flags_r = MAILBOX_NOSELECT;
+		/* non-selectable. probably either access denied, or symlink
+		   destination not found. don't bother logging errors. */
+		*flags |= MAILBOX_NOSELECT;
 		return 0;
 	}
 }
diff -r 8be0fe79093b -r 401d1d3f4eca src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Thu Nov 13 12:05:54 2008 +0200
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Sat Nov 15 17:57:38 2008 +0200
@@ -835,7 +835,7 @@ static int mbox_list_iter_is_mailbox(str
 				     const char *dir, const char *fname,
 				     const char *mailbox_name ATTR_UNUSED,
 				     enum mailbox_list_file_type type,
-				     enum mailbox_info_flags *flags_r)
+				     enum mailbox_info_flags *flags)
 {
 	struct mail_storage *storage = MBOX_LIST_CONTEXT(ctx->list);
 	const char *path, *root_dir;
@@ -843,14 +843,14 @@ static int mbox_list_iter_is_mailbox(str
 	struct stat st;
 
 	if (strcmp(fname, MBOX_INDEX_DIR_NAME) == 0) {
-		*flags_r = MAILBOX_NOSELECT;
+		*flags |= MAILBOX_NOSELECT;
 		return 0;
 	}
 	if (strcmp(fname, MBOX_SUBSCRIPTION_FILE_NAME) == 0) {
 		root_dir = mailbox_list_get_path(storage->list, NULL,
 					MAILBOX_LIST_PATH_TYPE_MAILBOX);
 		if (strcmp(root_dir, dir) == 0) {
-			*flags_r = MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
+			*flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
 			return 0;
 		}
 	}
@@ -858,19 +858,19 @@ static int mbox_list_iter_is_mailbox(str
 	/* skip all .lock files */
 	len = strlen(fname);
 	if (len > 5 && strcmp(fname+len-5, ".lock") == 0) {
-		*flags_r = MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
+		*flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
 		return 0;
 	}
 
 	/* try to avoid stat() with these checks */
 	if (type == MAILBOX_LIST_FILE_TYPE_DIR) {
-		*flags_r = MAILBOX_NOSELECT | MAILBOX_CHILDREN;
+		*flags |= MAILBOX_NOSELECT | MAILBOX_CHILDREN;
 		return 1;
 	}
 	if (type != MAILBOX_LIST_FILE_TYPE_SYMLINK &&
 	    type != MAILBOX_LIST_FILE_TYPE_UNKNOWN &&
 	    (ctx->flags & MAILBOX_LIST_ITER_RETURN_NO_FLAGS) != 0) {
-		*flags_r = MAILBOX_NOINFERIORS;
+		*flags |= MAILBOX_NOINFERIORS;
 		return 1;
 	}
 
@@ -878,27 +878,27 @@ static int mbox_list_iter_is_mailbox(str
 	path = t_strconcat(dir, "/", fname, NULL);
 	if (stat(path, &st) == 0) {
 		if (S_ISDIR(st.st_mode))
-			*flags_r = MAILBOX_NOSELECT | MAILBOX_CHILDREN;
+			*flags |= MAILBOX_NOSELECT | MAILBOX_CHILDREN;
 		else {
-			*flags_r = MAILBOX_NOINFERIORS | STAT_GET_MARKED(st);
+			*flags |= MAILBOX_NOINFERIORS | STAT_GET_MARKED(st);
 			if (is_inbox_file(ctx->list, path, fname) &&
 			    strcmp(fname, "INBOX") != 0) {
 				/* it's possible for INBOX to have child
 				   mailboxes as long as the inbox file itself
 				   isn't in <mail root>/INBOX */
-				*flags_r &= ~MAILBOX_NOINFERIORS;
+				*flags &= ~MAILBOX_NOINFERIORS;
 			}
 		}
 		return 1;
-	} else if (errno == EACCES || errno == ELOOP) {
-		*flags_r = MAILBOX_NOSELECT;
+	} else if (errno == ENOENT) {
+		/* doesn't exist - probably a non-existing subscribed mailbox */
+		*flags |= MAILBOX_NONEXISTENT;
 		return 1;
-	} else if (ENOTFOUND(errno)) {
-		*flags_r = MAILBOX_NONEXISTENT;
+	} else {
+		/* non-selectable. probably either access denied, or symlink
+		   destination not found. don't bother logging errors. */
+		*flags |= MAILBOX_NOSELECT;
 		return 0;
-	} else {
-		mail_storage_set_critical(storage, "stat(%s) failed: %m", path);
-		return -1;
 	}
 }
 


More information about the dovecot-cvs mailing list