annotate src/lib-storage/list/mailbox-list-maildir-iter.c @ 5807:ec09ad1d017f HEAD

mailbox_list_iter_next() returns now const pointer.
author Timo Sirainen <tss@iki.fi>
date Wed, 27 Jun 2007 17:00:32 +0300
parents eb8dc8a79d5d
children 45735dd11f17
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002-2006 Timo Sirainen */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "str.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "home-expand.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "imap-match.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "subscription-file.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mailbox-tree.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mailbox-list-maildir.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include <dirent.h>
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #define MAILBOX_FLAG_MATCHED 0x40000000
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct maildir_list_iterate_context {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct mailbox_list_iterate_context ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 pool_t pool;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 const char *dir, *prefix;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct mailbox_tree_context *tree_ctx;
5547
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
22 struct mailbox_tree_iterate_context *tree_iter;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct mailbox_info info;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 };
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 static void maildir_nodes_fix(struct mailbox_node *node, bool is_subs)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 while (node != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 if (node->children != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 node->flags |= MAILBOX_CHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 node->flags &= ~MAILBOX_NOCHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 maildir_nodes_fix(node->children, is_subs);
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
34 } else if ((node->flags & MAILBOX_NONEXISTENT) != 0) {
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 if (!is_subs) {
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
36 node->flags &= ~MAILBOX_NONEXISTENT;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 node->flags |= MAILBOX_NOSELECT;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 }
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
39 node->flags |= MAILBOX_CHILDREN;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 node = node->next;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 static int
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 maildir_fill_readdir(struct maildir_list_iterate_context *ctx,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct imap_match_glob *glob, bool update_only)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 DIR *dirp;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 struct dirent *d;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 const char *p, *mailbox_c;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 string_t *mailbox;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 enum mailbox_info_flags flags;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 enum imap_match_result match;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 struct mailbox_node *node;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 bool created;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 char hierarchy_sep;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 int ret;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 dirp = opendir(ctx->dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 if (dirp == NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 if (errno != ENOENT) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 mailbox_list_set_critical(ctx->ctx.list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 "opendir(%s) failed: %m", ctx->dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 return -1;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 return 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 hierarchy_sep = ctx->ctx.list->hierarchy_sep;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 t_push();
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 mailbox = t_str_new(PATH_MAX);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 while ((d = readdir(dirp)) != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 const char *fname = d->d_name;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 if (fname[0] != hierarchy_sep)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 continue;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 /* skip . and .. */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 if (fname[0] == '.' &&
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 (fname[1] == '\0' || (fname[1] == '.' && fname[2] == '\0')))
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 continue;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 /* make sure the mask matches */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 str_truncate(mailbox, 0);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 str_append(mailbox, ctx->prefix);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 str_append(mailbox, fname + 1);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 mailbox_c = str_c(mailbox);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 match = imap_match(glob, mailbox_c);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 if (match != IMAP_MATCH_YES &&
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 match != IMAP_MATCH_PARENT)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 continue;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 /* check if this is an actual mailbox */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 flags = 0;
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
99 ret = ctx->ctx.list->v.
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
100 iter_is_mailbox(&ctx->ctx, ctx->dir, fname,
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
101 mailbox_list_get_file_type(d), &flags);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 if (ret < 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 t_pop();
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return -1;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 if (ret == 0)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 continue;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 if (match == IMAP_MATCH_PARENT) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 t_push();
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 while ((p = strrchr(mailbox_c,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 hierarchy_sep)) != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 str_truncate(mailbox, (size_t) (p-mailbox_c));
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 mailbox_c = str_c(mailbox);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (imap_match(glob, mailbox_c) > 0)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 i_assert(p != NULL);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 created = FALSE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 node = update_only ?
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 mailbox_tree_update(ctx->tree_ctx, mailbox_c) :
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 mailbox_tree_get(ctx->tree_ctx,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 mailbox_c, &created);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (node != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 if (created)
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
127 node->flags = MAILBOX_NONEXISTENT;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 node->flags |= MAILBOX_CHILDREN |
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 MAILBOX_FLAG_MATCHED;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 node->flags &= ~MAILBOX_NOCHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 t_pop();
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 } else {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 created = FALSE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 node = update_only ?
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 mailbox_tree_update(ctx->tree_ctx, mailbox_c) :
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 mailbox_tree_get(ctx->tree_ctx,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 mailbox_c, &created);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 if (node != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 if (created)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 node->flags = MAILBOX_NOCHILDREN;
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
145 node->flags &= ~MAILBOX_NONEXISTENT;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 node->flags |= MAILBOX_FLAG_MATCHED;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 }
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
149 if (node != NULL) {
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
150 node->flags |= flags & ~(MAILBOX_NOINFERIORS |
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
151 MAILBOX_CHILDREN |
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
152 MAILBOX_NOCHILDREN);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
153 }
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 t_pop();
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 if (closedir(dirp) < 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 mailbox_list_set_critical(ctx->ctx.list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 "readdir(%s) failed: %m", ctx->dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 return -1;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
5567
eb8dc8a79d5d Removed HAS_INBOX and SHARED_NAMESPACE flags from mail storage and mailbox
Timo Sirainen <tss@iki.fi>
parents: 5547
diff changeset
163 if (ctx->ctx.list->ns->inbox &&
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 (ctx->ctx.flags & MAILBOX_LIST_ITER_SUBSCRIBED) == 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 /* make sure INBOX is there */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 node = mailbox_tree_get(ctx->tree_ctx, "INBOX", &created);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 if (created)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 node->flags = MAILBOX_NOCHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 else
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
170 node->flags &= ~MAILBOX_NONEXISTENT;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 switch (imap_match(glob, "INBOX")) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 case IMAP_MATCH_YES:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 case IMAP_MATCH_PARENT:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 node->flags |= MAILBOX_FLAG_MATCHED;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 default:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 maildir_nodes_fix(mailbox_tree_get(ctx->tree_ctx, NULL, NULL),
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 (ctx->ctx.flags & MAILBOX_LIST_ITER_SUBSCRIBED) != 0);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 return 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 static int maildir_fill_subscribed(struct maildir_list_iterate_context *ctx,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 struct imap_match_glob *glob)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 struct subsfile_list_context *subsfile_ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 const char *path, *name, *p;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 struct mailbox_node *node;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 char hierarchy_sep;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 bool created;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 path = t_strconcat(ctx->ctx.list->set.control_dir != NULL ?
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 ctx->ctx.list->set.control_dir :
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 ctx->ctx.list->set.root_dir,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 "/", ctx->ctx.list->set.subscription_fname, NULL);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 subsfile_ctx = subsfile_list_init(ctx->ctx.list, path);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 hierarchy_sep = ctx->ctx.list->hierarchy_sep;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 while ((name = subsfile_list_next(subsfile_ctx)) != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 switch (imap_match(glob, name)) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 case IMAP_MATCH_YES:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 node = mailbox_tree_get(ctx->tree_ctx, name, NULL);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 node->flags = MAILBOX_FLAG_MATCHED;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 if ((ctx->ctx.flags &
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 MAILBOX_LIST_ITER_FAST_FLAGS) == 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 node->flags |= MAILBOX_NONEXISTENT |
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 MAILBOX_NOCHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 case IMAP_MATCH_PARENT:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 /* placeholder */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 while ((p = strrchr(name, hierarchy_sep)) != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 name = t_strdup_until(name, p);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 if (imap_match(glob, name) > 0)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 i_assert(p != NULL);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 node = mailbox_tree_get(ctx->tree_ctx, name, &created);
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
223 if (created) node->flags = MAILBOX_NONEXISTENT;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 node->flags |= MAILBOX_FLAG_MATCHED | MAILBOX_CHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 node->flags &= ~MAILBOX_NOCHILDREN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 default:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 return subsfile_list_deinit(subsfile_ctx);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 struct mailbox_list_iterate_context *
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
236 maildir_list_iter_init(struct mailbox_list *_list, const char *mask,
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 enum mailbox_list_iter_flags flags)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 struct maildir_list_iterate_context *ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 struct imap_match_glob *glob;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 const char *dir, *p;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 pool_t pool;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 pool = pool_alloconly_create("maildir_list", 1024);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 ctx = p_new(pool, struct maildir_list_iterate_context, 1);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 ctx->ctx.list = _list;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 ctx->ctx.flags = flags;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 ctx->pool = pool;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 ctx->tree_ctx = mailbox_tree_init(_list->hierarchy_sep);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 glob = imap_match_init(pool, mask, TRUE, _list->hierarchy_sep);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 ctx->dir = _list->set.root_dir;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 ctx->prefix = "";
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 if ((flags & MAILBOX_LIST_ITER_SUBSCRIBED) != 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (maildir_fill_subscribed(ctx, glob) < 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 ctx->ctx.failed = TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 return &ctx->ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 }
5473
b5404d36494f cleanup
Timo Sirainen <tss@iki.fi>
parents: 5448
diff changeset
261 } else if ((_list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0 &&
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 (p = strrchr(mask, '/')) != NULL) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 dir = t_strdup_until(mask, p);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 ctx->prefix = p_strdup_until(pool, mask, p+1);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 if (*mask != '/' && *mask != '~')
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 dir = t_strconcat(_list->set.root_dir, "/", dir, NULL);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 ctx->dir = p_strdup(pool, home_expand(dir));
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 if ((flags & MAILBOX_LIST_ITER_SUBSCRIBED) == 0 ||
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 (ctx->ctx.flags & MAILBOX_LIST_ITER_FAST_FLAGS) == 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 bool update_only = (flags & MAILBOX_LIST_ITER_SUBSCRIBED) != 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 if (maildir_fill_readdir(ctx, glob, update_only) < 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 ctx->ctx.failed = TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 return &ctx->ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
5547
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
280 ctx->tree_iter = mailbox_tree_iterate_init(ctx->tree_ctx, NULL,
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
281 MAILBOX_FLAG_MATCHED);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 return &ctx->ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 int maildir_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 struct maildir_list_iterate_context *ctx =
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 (struct maildir_list_iterate_context *)_ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 int ret = ctx->ctx.failed ? -1 : 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
5547
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
291 if (ctx->tree_iter != NULL)
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
292 mailbox_tree_iterate_deinit(&ctx->tree_iter);
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
293 mailbox_tree_deinit(&ctx->tree_ctx);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 pool_unref(ctx->pool);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 return ret;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5567
diff changeset
298 const struct mailbox_info *
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 maildir_list_iter_next(struct mailbox_list_iterate_context *_ctx)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 struct maildir_list_iterate_context *ctx =
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 (struct maildir_list_iterate_context *)_ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 struct mailbox_node *node;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
5547
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
305 if (ctx->ctx.failed)
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
306 return NULL;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
5547
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
308 node = mailbox_tree_iterate_next(ctx->tree_iter, &ctx->info.name);
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
309 if (node == NULL)
c03655b70b57 Moved mailbox_tree iteration code from maildir++ to common code, and rewrote
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
310 return NULL;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 ctx->info.flags = node->flags;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 return &ctx->info;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 }