Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/lazy-expunge/lazy-expunge-plugin.c @ 6275:913b188f4dd4 HEAD
Removed explicit locking from views and maps. They were already locked all
the time when they were used. Because of this change several functions can
no longer fail, so they were changed to return void, and a lot of pointless
error handling was removed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 12 Aug 2007 16:43:05 +0300 |
parents | cff0c129b3da |
children | 5f66277bbe40 |
rev | line source |
---|---|
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2006 Timo Sirainen */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
2 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
3 #include "lib.h" |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
5 #include "array.h" |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
6 #include "str.h" |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
7 #include "seq-range-array.h" |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
8 #include "maildir-storage.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5450
diff
changeset
|
9 #include "mail-namespace.h" |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
10 #include "lazy-expunge-plugin.h" |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
11 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
12 #include <stdio.h> |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
13 #include <stdlib.h> |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
14 #include <unistd.h> |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
15 #include <dirent.h> |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
16 #include <time.h> |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
17 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
18 #define LAZY_EXPUNGE_CONTEXT(obj) \ |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
19 MODULE_CONTEXT(obj, lazy_expunge_mail_storage_module) |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
20 #define LAZY_EXPUNGE_LIST_CONTEXT(obj) \ |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
21 MODULE_CONTEXT(obj, lazy_expunge_mailbox_list_module) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
22 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
23 enum lazy_namespace { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
24 LAZY_NAMESPACE_EXPUNGE, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
25 LAZY_NAMESPACE_DELETE, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
26 LAZY_NAMESPACE_DELETE_EXPUNGE, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
27 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
28 LAZY_NAMESPACE_COUNT |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
29 }; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
30 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
31 struct lazy_expunge_mailbox_list { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
32 union mailbox_list_module_context module_ctx; |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
33 |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
34 struct mail_storage *storage; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
35 }; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
36 |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
37 struct lazy_expunge_mail_storage { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
38 union mail_storage_module_context module_ctx; |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
39 |
4916 | 40 bool internal_namespace; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
41 }; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
42 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
43 struct lazy_expunge_transaction { |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
44 union mailbox_transaction_module_context module_ctx; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
45 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
46 ARRAY_TYPE(seq_range) expunge_seqs; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
47 struct mailbox *expunge_box; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
48 }; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
49 |
5185
24f4a959a24c
Added <plugin_name>_version string.
Timo Sirainen <tss@iki.fi>
parents:
4992
diff
changeset
|
50 const char *lazy_expunge_plugin_version = PACKAGE_VERSION; |
24f4a959a24c
Added <plugin_name>_version string.
Timo Sirainen <tss@iki.fi>
parents:
4992
diff
changeset
|
51 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
52 static void (*lazy_expunge_next_hook_mail_namespaces_created) |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
53 (struct mail_namespace *namespaces); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
54 static void (*lazy_expunge_next_hook_mail_storage_created) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
55 (struct mail_storage *storage); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
56 static void (*lazy_expunge_next_hook_mailbox_list_created) |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
57 (struct mailbox_list *list); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
58 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
59 static MODULE_CONTEXT_DEFINE_INIT(lazy_expunge_mail_storage_module, |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
60 &mail_storage_module_register); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
61 static MODULE_CONTEXT_DEFINE_INIT(lazy_expunge_mail_module, |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
62 &mail_module_register); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
63 static MODULE_CONTEXT_DEFINE_INIT(lazy_expunge_mailbox_list_module, |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
64 &mailbox_list_module_register); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
65 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5450
diff
changeset
|
66 static struct mail_namespace *lazy_namespaces[LAZY_NAMESPACE_COUNT]; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
67 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
68 static struct mailbox * |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
69 mailbox_open_or_create(struct mail_storage *storage, const char *name) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
70 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
71 struct mailbox *box; |
5613 | 72 enum mail_error error; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
73 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
74 box = mailbox_open(storage, name, NULL, MAILBOX_OPEN_FAST | |
4916 | 75 MAILBOX_OPEN_KEEP_RECENT | |
76 MAILBOX_OPEN_NO_INDEX_FILES); | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
77 if (box != NULL) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
78 return box; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
79 |
5613 | 80 (void)mail_storage_get_last_error(storage, &error); |
81 if (error != MAIL_ERROR_NOTFOUND) | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
82 return NULL; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
83 |
5613 | 84 /* try creating it. */ |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
85 if (mail_storage_mailbox_create(storage, name, FALSE) < 0) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
86 return NULL; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
87 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
88 /* and try opening again */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
89 box = mailbox_open(storage, name, NULL, MAILBOX_OPEN_FAST | |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
90 MAILBOX_OPEN_KEEP_RECENT); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
91 return box; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
92 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
93 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
94 static int lazy_expunge_mail_expunge(struct mail *_mail) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
95 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
96 struct lazy_expunge_transaction *lt = |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
97 LAZY_EXPUNGE_CONTEXT(_mail->transaction); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
98 struct mail_storage *deststorage; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
99 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
100 if (lt->expunge_box == NULL) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
101 deststorage = lazy_namespaces[LAZY_NAMESPACE_EXPUNGE]->storage; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
102 lt->expunge_box = mailbox_open_or_create(deststorage, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
103 _mail->box->name); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
104 if (lt->expunge_box == NULL) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
105 mail_storage_set_critical(_mail->box->storage, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
106 "lazy_expunge: Couldn't open expunge mailbox"); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
107 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
108 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
109 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
110 |
4916 | 111 seq_range_array_add(<->expunge_seqs, 32, _mail->uid); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
112 return 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
113 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
114 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
115 static struct mailbox_transaction_context * |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
116 lazy_expunge_transaction_begin(struct mailbox *box, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
117 enum mailbox_transaction_flags flags) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
118 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
119 union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(box); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
120 struct mailbox_transaction_context *t; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
121 struct lazy_expunge_transaction *lt; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
122 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
123 t = mbox->super.transaction_begin(box, flags); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
124 lt = i_new(struct lazy_expunge_transaction, 1); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
125 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
126 MODULE_CONTEXT_SET(t, lazy_expunge_mail_storage_module, lt); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
127 return t; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
128 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
129 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
130 struct lazy_expunge_move_context { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
131 string_t *path; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
132 unsigned int dir_len; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
133 }; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
134 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
135 static int lazy_expunge_move(struct maildir_mailbox *mbox __attr_unused__, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
136 const char *path, void *context) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
137 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
138 struct lazy_expunge_move_context *ctx = context; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
139 const char *p; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
140 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
141 str_truncate(ctx->path, ctx->dir_len); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
142 p = strrchr(path, '/'); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
143 str_append(ctx->path, p == NULL ? path : p + 1); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
144 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
145 if (rename(path, str_c(ctx->path)) == 0) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
146 return 1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
147 return errno == ENOENT ? 0 : -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
148 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
149 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
150 static int lazy_expunge_move_expunges(struct mailbox *srcbox, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
151 struct lazy_expunge_transaction *lt) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
152 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
153 struct maildir_mailbox *msrcbox = (struct maildir_mailbox *)srcbox; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
154 struct mailbox_transaction_context *trans; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
155 struct index_transaction_context *itrans; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
156 struct lazy_expunge_move_context ctx; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
157 const struct seq_range *range; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
158 unsigned int i, count; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
159 const char *dir; |
4916 | 160 uint32_t seq, uid, seq1, seq2; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
161 bool is_file; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
162 int ret = 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
163 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
164 dir = mail_storage_get_mailbox_path(lt->expunge_box->storage, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
165 lt->expunge_box->name, &is_file); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
166 dir = t_strconcat(dir, "/cur/", NULL); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
167 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
168 ctx.path = str_new(default_pool, 256); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
169 str_append(ctx.path, dir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
170 ctx.dir_len = str_len(ctx.path); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
171 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
172 trans = mailbox_transaction_begin(srcbox, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
173 MAILBOX_TRANSACTION_FLAG_EXTERNAL); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
174 itrans = (struct index_transaction_context *)trans; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
175 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
176 range = array_get(<->expunge_seqs, &count); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
177 for (i = 0; i < count && ret == 0; i++) { |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6272
diff
changeset
|
178 mailbox_get_uids(srcbox, range[i].seq1, range[i].seq2, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6272
diff
changeset
|
179 &seq1, &seq2); |
4916 | 180 for (uid = range[i].seq1; uid <= range[i].seq2; uid++) { |
181 if (maildir_file_do(msrcbox, uid, lazy_expunge_move, | |
182 &ctx) < 0) { | |
183 ret = -1; | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
184 break; |
4916 | 185 } |
186 } | |
187 for (seq = seq1; seq <= seq2; seq++) | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
188 mail_index_expunge(itrans->trans, seq); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
189 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
190 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
191 if (mailbox_transaction_commit(&trans, 0) < 0) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
192 ret = -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
193 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
194 str_free(&ctx.path); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
195 return ret; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
196 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
197 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
198 static void lazy_expunge_transaction_free(struct lazy_expunge_transaction *lt) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
199 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
200 if (lt->expunge_box != NULL) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
201 mailbox_close(<->expunge_box); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
202 if (array_is_created(<->expunge_seqs)) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
203 array_free(<->expunge_seqs); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
204 i_free(lt); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
205 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
206 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
207 static int |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
208 lazy_expunge_transaction_commit(struct mailbox_transaction_context *ctx, |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
209 enum mailbox_sync_flags flags, |
6272 | 210 uint32_t *uid_validity_r, |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
211 uint32_t *first_saved_uid_r, |
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
212 uint32_t *last_saved_uid_r) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
213 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
214 union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(ctx->box); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
215 struct lazy_expunge_transaction *lt = LAZY_EXPUNGE_CONTEXT(ctx); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
216 struct mailbox *srcbox = ctx->box; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
217 int ret; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
218 |
6272 | 219 ret = mbox->super.transaction_commit(ctx, flags, uid_validity_r, |
220 first_saved_uid_r, | |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
221 last_saved_uid_r); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
222 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
223 if (ret == 0 && array_is_created(<->expunge_seqs)) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
224 ret = lazy_expunge_move_expunges(srcbox, lt); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
225 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
226 lazy_expunge_transaction_free(lt); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
227 return ret; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
228 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
229 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
230 static void |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
231 lazy_expunge_transaction_rollback(struct mailbox_transaction_context *ctx) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
232 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
233 union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(ctx->box); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
234 struct lazy_expunge_transaction *lt = LAZY_EXPUNGE_CONTEXT(ctx); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
235 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
236 mbox->super.transaction_rollback(ctx); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
237 lazy_expunge_transaction_free(lt); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
238 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
239 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
240 static struct mail * |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
241 lazy_expunge_mail_alloc(struct mailbox_transaction_context *t, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
242 enum mail_fetch_field wanted_fields, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
243 struct mailbox_header_lookup_ctx *wanted_headers) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
244 { |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
245 union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(t->box); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
246 union mail_module_context *mmail; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
247 struct mail *_mail; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
248 struct mail_private *mail; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
249 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
250 _mail = mbox->super.mail_alloc(t, wanted_fields, wanted_headers); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
251 mail = (struct mail_private *)_mail; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
252 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
253 mmail = p_new(mail->pool, union mail_module_context, 1); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
254 mmail->super = mail->v; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
255 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
256 mail->v.expunge = lazy_expunge_mail_expunge; |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
257 MODULE_CONTEXT_SET_SELF(mail, lazy_expunge_mail_module, mmail); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
258 return _mail; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
259 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
260 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
261 static struct mailbox * |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
262 lazy_expunge_mailbox_open(struct mail_storage *storage, const char *name, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
263 struct istream *input, enum mailbox_open_flags flags) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
264 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
265 struct lazy_expunge_mail_storage *lstorage = |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
266 LAZY_EXPUNGE_CONTEXT(storage); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
267 struct mailbox *box; |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
268 union mailbox_module_context *mbox; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
269 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
270 box = lstorage->module_ctx.super. |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
271 mailbox_open(storage, name, input, flags); |
4916 | 272 if (box == NULL || lstorage->internal_namespace) |
273 return box; | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
274 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
275 mbox = p_new(box->pool, union mailbox_module_context, 1); |
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
276 mbox->super = box->v; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
277 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
278 box->v.transaction_begin = lazy_expunge_transaction_begin; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
279 box->v.transaction_commit = lazy_expunge_transaction_commit; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
280 box->v.transaction_rollback = lazy_expunge_transaction_rollback; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
281 box->v.mail_alloc = lazy_expunge_mail_alloc; |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
282 MODULE_CONTEXT_SET_SELF(box, lazy_expunge_mail_storage_module, mbox); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
283 return box; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
284 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
285 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
286 static int dir_move_or_merge(struct mailbox_list *list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
287 const char *srcdir, const char *destdir) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
288 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
289 DIR *dir; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
290 struct dirent *dp; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
291 string_t *src_path, *dest_path; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
292 unsigned int src_dirlen, dest_dirlen; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
293 int ret = 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
294 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
295 if (rename(srcdir, destdir) == 0 || errno == ENOENT) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
296 return 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
297 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
298 if (!EDESTDIREXISTS(errno)) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
299 mailbox_list_set_critical(list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
300 "rename(%s, %s) failed: %m", srcdir, destdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
301 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
302 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
303 /* rename all the files separately */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
304 dir = opendir(srcdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
305 if (dir == NULL) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
306 mailbox_list_set_critical(list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
307 "opendir(%s) failed: %m", srcdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
308 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
309 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
310 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
311 src_path = t_str_new(512); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
312 dest_path = t_str_new(512); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
313 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
314 str_append(src_path, srcdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
315 str_append(dest_path, destdir); |
4992
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
316 str_append_c(src_path, '/'); |
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
317 str_append_c(dest_path, '/'); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
318 src_dirlen = str_len(src_path); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
319 dest_dirlen = str_len(dest_path); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
320 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
321 while ((dp = readdir(dir)) != NULL) { |
4992
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
322 if (dp->d_name[0] == '.' && |
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
323 (dp->d_name[1] == '\0' || |
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
324 (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) |
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
325 continue; |
d45c13b90629
If index/control dirs were different than the maildir, deleting mailboxes
Timo Sirainen <tss@iki.fi>
parents:
4916
diff
changeset
|
326 |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
327 str_truncate(src_path, src_dirlen); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
328 str_append(src_path, dp->d_name); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
329 str_truncate(dest_path, dest_dirlen); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
330 str_append(dest_path, dp->d_name); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
331 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
332 if (rename(str_c(src_path), str_c(dest_path)) < 0 && |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
333 errno != ENOENT) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
334 mailbox_list_set_critical(list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
335 "rename(%s, %s) failed: %m", |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
336 str_c(src_path), str_c(dest_path)); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
337 ret = -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
338 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
339 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
340 if (closedir(dir) < 0) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
341 mailbox_list_set_critical(list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
342 "closedir(%s) failed: %m", srcdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
343 ret = -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
344 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
345 if (ret == 0) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
346 if (rmdir(srcdir) < 0) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
347 mailbox_list_set_critical(list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
348 "rmdir(%s) failed: %m", srcdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
349 ret = -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
350 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
351 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
352 return ret; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
353 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
354 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
355 static int |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
356 mailbox_move(struct mailbox_list *src_list, const char *src_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
357 struct mailbox_list *dest_list, const char **_dest_name) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
358 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
359 const char *dest_name = *_dest_name; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
360 const char *srcdir, *src2dir, *src3dir, *destdir; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
361 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
362 srcdir = mailbox_list_get_path(src_list, src_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
363 MAILBOX_LIST_PATH_TYPE_MAILBOX); |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
364 destdir = mailbox_list_get_path(dest_list, dest_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
365 MAILBOX_LIST_PATH_TYPE_MAILBOX); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
366 while (rename(srcdir, destdir) < 0) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
367 if (errno == ENOENT) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
368 return 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
369 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
370 if (!EDESTDIREXISTS(errno)) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
371 mailbox_list_set_critical(src_list, |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
372 "rename(%s, %s) failed: %m", srcdir, destdir); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
373 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
374 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
375 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
376 /* mailbox is being deleted multiple times per second. |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
377 update the filename. */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
378 dest_name = t_strdup_printf("%s-%04u", *_dest_name, |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
379 (uint32_t)random()); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
380 destdir = mailbox_list_get_path(dest_list, dest_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
381 MAILBOX_LIST_PATH_TYPE_MAILBOX); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
382 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
383 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
384 t_push(); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
385 src2dir = mailbox_list_get_path(src_list, src_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
386 MAILBOX_LIST_PATH_TYPE_CONTROL); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
387 if (strcmp(src2dir, srcdir) != 0) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
388 destdir = mailbox_list_get_path(dest_list, dest_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
389 MAILBOX_LIST_PATH_TYPE_CONTROL); |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
390 (void)dir_move_or_merge(src_list, src2dir, destdir); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
391 } |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
392 src3dir = mailbox_list_get_path(src_list, src_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
393 MAILBOX_LIST_PATH_TYPE_INDEX); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
394 if (strcmp(src3dir, srcdir) != 0 && strcmp(src3dir, src2dir) != 0) { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
395 destdir = mailbox_list_get_path(dest_list, dest_name, |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
396 MAILBOX_LIST_PATH_TYPE_INDEX); |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
397 (void)dir_move_or_merge(src_list, src3dir, destdir); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
398 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
399 t_pop(); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
400 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
401 *_dest_name = dest_name; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
402 return 1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
403 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
404 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
405 static int |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
406 lazy_expunge_mailbox_list_delete(struct mailbox_list *list, const char *name) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
407 { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
408 struct lazy_expunge_mailbox_list *llist = |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
409 LAZY_EXPUNGE_LIST_CONTEXT(list); |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
410 struct lazy_expunge_mail_storage *lstorage; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
411 struct mailbox_list *dest_list; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
412 enum mailbox_name_status status; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
413 const char *destname; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
414 struct tm *tm; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
415 char timestamp[256]; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
416 int ret; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
417 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
418 if (llist->storage == NULL) { |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
419 /* not a maildir storage */ |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
420 return llist->module_ctx.super.delete_mailbox(list, name); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
421 } |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
422 |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
423 lstorage = LAZY_EXPUNGE_CONTEXT(llist->storage); |
4916 | 424 if (lstorage->internal_namespace) |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
425 return llist->module_ctx.super.delete_mailbox(list, name); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
426 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
427 /* first do the normal sanity checks */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
428 if (strcmp(name, "INBOX") == 0) { |
5613 | 429 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, |
430 "INBOX can't be deleted."); | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
431 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
432 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
433 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
434 if (mailbox_list_get_mailbox_name_status(list, name, &status) < 0) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
435 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
436 if (status == MAILBOX_NAME_INVALID) { |
5613 | 437 mailbox_list_set_error(list, MAIL_ERROR_PARAMS, |
438 "Invalid mailbox name"); | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
439 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
440 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
441 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
442 /* destination mailbox name needs to contain a timestamp */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
443 tm = localtime(&ioloop_time); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
444 if (strftime(timestamp, sizeof(timestamp), "%Y%m%d-%H%M%S", tm) == 0) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
445 strocpy(timestamp, dec2str(ioloop_time), sizeof(timestamp)); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
446 destname = t_strconcat(name, "-", timestamp, NULL); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
447 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
448 /* first move the actual mailbox */ |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
449 dest_list = lazy_namespaces[LAZY_NAMESPACE_DELETE]->storage->list; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
450 if ((ret = mailbox_move(list, name, dest_list, &destname)) < 0) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
451 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
452 if (ret == 0) { |
5613 | 453 mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, |
454 T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
455 return -1; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
456 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
457 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
458 /* next move the expunged messages mailbox, if it exists */ |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
459 list = lazy_namespaces[LAZY_NAMESPACE_EXPUNGE]->storage->list; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
460 dest_list = |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
461 lazy_namespaces[LAZY_NAMESPACE_DELETE_EXPUNGE]->storage->list; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
462 (void)mailbox_move(list, name, dest_list, &destname); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
463 return 0; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
464 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
465 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
466 static void lazy_expunge_mail_storage_created(struct mail_storage *storage) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
467 { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
468 struct lazy_expunge_mailbox_list *llist = |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
469 LAZY_EXPUNGE_LIST_CONTEXT(storage->list); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
470 struct lazy_expunge_mail_storage *lstorage; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
471 |
4916 | 472 if (lazy_expunge_next_hook_mail_storage_created != NULL) |
473 lazy_expunge_next_hook_mail_storage_created(storage); | |
474 | |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
475 /* only maildir supported for now */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
476 if (strcmp(storage->name, "maildir") != 0) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
477 return; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
478 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
479 llist->storage = storage; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
480 |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
481 lstorage = p_new(storage->pool, struct lazy_expunge_mail_storage, 1); |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
482 lstorage->module_ctx.super = storage->v; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
483 storage->v.mailbox_open = lazy_expunge_mailbox_open; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
484 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
485 MODULE_CONTEXT_SET(storage, lazy_expunge_mail_storage_module, lstorage); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
486 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
487 |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
488 static void lazy_expunge_mailbox_list_created(struct mailbox_list *list) |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
489 { |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
490 struct lazy_expunge_mailbox_list *llist; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
491 |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
492 if (lazy_expunge_next_hook_mailbox_list_created != NULL) |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
493 lazy_expunge_next_hook_mailbox_list_created(list); |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
494 |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
495 llist = p_new(list->pool, struct lazy_expunge_mailbox_list, 1); |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
496 llist->module_ctx.super = list->v; |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
497 list->v.delete_mailbox = lazy_expunge_mailbox_list_delete; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
498 |
5450
7a6db5ec047d
Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents:
5448
diff
changeset
|
499 MODULE_CONTEXT_SET(list, lazy_expunge_mailbox_list_module, llist); |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
500 } |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
501 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
502 static void |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
503 lazy_expunge_hook_mail_namespaces_created(struct mail_namespace *namespaces) |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
504 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
505 struct lazy_expunge_mail_storage *lstorage; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
506 const char *const *p; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
507 int i; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
508 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
509 if (lazy_expunge_next_hook_mail_namespaces_created != NULL) |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
510 lazy_expunge_next_hook_mail_namespaces_created(namespaces); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
511 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
512 t_push(); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
513 p = t_strsplit(getenv("LAZY_EXPUNGE"), " "); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
514 for (i = 0; i < LAZY_NAMESPACE_COUNT; i++, p++) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
515 const char *name = *p; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
516 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
517 if (name == NULL) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
518 i_fatal("lazy_expunge: Missing namespace #%d", i + 1); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
519 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
520 lazy_namespaces[i] = |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
521 mail_namespace_find_prefix(namespaces, name); |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
522 if (lazy_namespaces[i] == NULL) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
523 i_fatal("lazy_expunge: Unknown namespace: '%s'", name); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
524 if (strcmp(lazy_namespaces[i]->storage->name, "maildir") != 0) { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
525 i_fatal("lazy_expunge: Namespace must be in maildir " |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
526 "format: %s", name); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
527 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
528 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
529 /* we don't want to override these namespaces' expunge/delete |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
530 operations. */ |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
531 lstorage = LAZY_EXPUNGE_CONTEXT(lazy_namespaces[i]->storage); |
4916 | 532 lstorage->internal_namespace = TRUE; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
533 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
534 t_pop(); |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
535 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
536 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
537 void lazy_expunge_plugin_init(void) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
538 { |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
539 if (getenv("LAZY_EXPUNGE") == NULL) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
540 return; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
541 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
542 lazy_expunge_next_hook_mail_namespaces_created = |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
543 hook_mail_namespaces_created; |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
544 hook_mail_namespaces_created = |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
545 lazy_expunge_hook_mail_namespaces_created; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
546 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
547 lazy_expunge_next_hook_mail_storage_created = |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
548 hook_mail_storage_created; |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
549 hook_mail_storage_created = lazy_expunge_mail_storage_created; |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
550 |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
551 lazy_expunge_next_hook_mailbox_list_created = hook_mailbox_list_created; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
552 hook_mailbox_list_created = lazy_expunge_mailbox_list_created; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
553 } |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
554 |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
555 void lazy_expunge_plugin_deinit(void) |
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
556 { |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
557 if (getenv("LAZY_EXPUNGE") == NULL) |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
558 return; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
559 |
6237
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
560 hook_mail_namespaces_created = |
ea9604a6cfd6
Fixed to use hook_mail_namespaces_created so we work also with pop3.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
561 lazy_expunge_hook_mail_namespaces_created; |
5448
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
562 hook_mail_storage_created = lazy_expunge_next_hook_mail_storage_created; |
beabd433cdae
Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents:
5185
diff
changeset
|
563 hook_mailbox_list_created = lazy_expunge_next_hook_mailbox_list_created; |
4913
dea1c8fa53f4
Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
564 } |