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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
75 MAILBOX_OPEN_KEEP_RECENT |
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
80 (void)mail_storage_get_last_error(storage, &error);
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
111 seq_range_array_add(&lt->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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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(&lt->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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
180 for (uid = range[i].seq1; uid <= range[i].seq2; uid++) {
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
181 if (maildir_file_do(msrcbox, uid, lazy_expunge_move,
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
182 &ctx) < 0) {
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
183 ret = -1;
4913
dea1c8fa53f4 Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
184 break;
4916
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
185 }
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
186 }
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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(&lt->expunge_box);
dea1c8fa53f4 Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
202 if (array_is_created(&lt->expunge_seqs))
dea1c8fa53f4 Added lazy expunge plugin.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
203 array_free(&lt->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
cff0c129b3da Compile fix
Timo Sirainen <tss@iki.fi>
parents: 6237
diff changeset
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
cff0c129b3da Compile fix
Timo Sirainen <tss@iki.fi>
parents: 6237
diff changeset
219 ret = mbox->super.transaction_commit(ctx, flags, uid_validity_r,
cff0c129b3da Compile fix
Timo Sirainen <tss@iki.fi>
parents: 6237
diff changeset
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(&lt->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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
272 if (box == NULL || lstorage->internal_namespace)
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
429 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
437 mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
453 mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5607
diff changeset
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
472 if (lazy_expunge_next_hook_mail_storage_created != NULL)
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
473 lazy_expunge_next_hook_mail_storage_created(storage);
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4913
diff changeset
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 }