dovecot-1.1: Maildir: LAYOUT=fs didn't return \NonExistent flag ...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 15 17:57:15 EET 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/548f7e1d0bbe
changeset: 8000:548f7e1d0bbe
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 15 17:57:10 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 af56e098c5e8 -r 548f7e1d0bbe src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c Thu Nov 06 15:33:53 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-storage.c Sat Nov 15 17:57:10 2008 +0200
@@ -883,13 +883,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;
}
@@ -897,7 +897,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:
@@ -912,18 +912,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 af56e098c5e8 -r 548f7e1d0bbe src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c Thu Nov 06 15:33:53 2008 +0200
+++ b/src/lib-storage/index/mbox/mbox-storage.c Sat Nov 15 17:57:10 2008 +0200
@@ -822,7 +822,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;
@@ -830,14 +830,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;
}
}
@@ -845,19 +845,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;
}
@@ -865,27 +865,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