From: Timo Sirainen Date: Sat, 15 Nov 2008 15:57:38 +0000 (+0200) Subject: Maildir: LAYOUT=fs didn't return \NonExistent flag correctly. X-Git-Tag: 1.2.alpha4~94 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dba4e98033fadc949e80f746daf3d1d107e9bdb8;p=thirdparty%2Fdovecot%2Fcore.git Maildir: LAYOUT=fs didn't return \NonExistent flag correctly. Also made the *_iter_is_mailbox() handling consistent between backends. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 564c67dedb..542843b736 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -881,13 +881,13 @@ maildir_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx 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 mailbox_list_iterate_context *ctx 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 mailbox_list_iterate_context *ctx 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 --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 5d3ab4e9d2..5bb5098e1f 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -835,7 +835,7 @@ static int mbox_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx, 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(struct mailbox_list_iterate_context *ctx, 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(struct mailbox_list_iterate_context *ctx, /* 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(struct mailbox_list_iterate_context *ctx, 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 /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; - return 0; } else { - mail_storage_set_critical(storage, "stat(%s) failed: %m", path); - return -1; + /* non-selectable. probably either access denied, or symlink + destination not found. don't bother logging errors. */ + *flags |= MAILBOX_NOSELECT; + return 0; } }