Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 9575:0a00dcc4f0ea HEAD
lib-storage: Allow shared namespace prefix to use %variable modifiers.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 26 May 2010 17:07:51 +0100 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
9331
diff
changeset
|
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */ |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "home-expand.h" |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
6 #include "mail-search-build.h" |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-storage-private.h" |
6249 | 8 #include "mailbox-list-private.h" |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mbox-snarf-plugin.h" |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <stdlib.h> |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <sys/stat.h> |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #define MBOX_SNARF_CONTEXT(obj) \ |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 MODULE_CONTEXT(obj, mbox_snarf_storage_module) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct mbox_snarf_mail_storage { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 union mail_storage_module_context module_ctx; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 const char *snarf_inbox_path; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 bool open_spool_inbox; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 }; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct mbox_snarf_mailbox { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 union mailbox_module_context module_ctx; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 }; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 const char *mbox_snarf_plugin_version = PACKAGE_VERSION; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 static void (*mbox_snarf_next_hook_mail_storage_created) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 (struct mail_storage *storage); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 static MODULE_CONTEXT_DEFINE_INIT(mbox_snarf_storage_module, |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 &mail_storage_module_register); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 static int mbox_snarf(struct mailbox *srcbox, struct mailbox *destbox) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 { |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
38 struct mail_search_args *search_args; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct mail_search_context *search_ctx; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct mailbox_transaction_context *src_trans, *dest_trans; |
8726
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
41 struct mail_save_context *save_ctx; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 struct mail *mail; |
8553
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
43 enum mail_error error; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 int ret; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
6463
aeee5076f99f
Use mailbox_sync() instead of our own implementation.
Timo Sirainen <tss@iki.fi>
parents:
6430
diff
changeset
|
46 if (mailbox_sync(srcbox, MAILBOX_SYNC_FLAG_FULL_READ, 0, NULL) < 0) |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 return -1; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 src_trans = mailbox_transaction_begin(srcbox, 0); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 dest_trans = mailbox_transaction_begin(destbox, |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 MAILBOX_TRANSACTION_FLAG_EXTERNAL); |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
52 |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
53 search_args = mail_search_build_init(); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
54 mail_search_build_add_all(search_args); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
55 search_ctx = mailbox_search_init(src_trans, search_args, NULL); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
56 mail_search_args_unref(&search_args); |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 mail = mail_alloc(src_trans, MAIL_FETCH_STREAM_HEADER | |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 MAIL_FETCH_STREAM_BODY, NULL); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 while ((ret = mailbox_search_next(search_ctx, mail)) > 0) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 if (mail->expunged) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 continue; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
8726
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
64 save_ctx = mailbox_save_alloc(dest_trans); |
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
65 if (mailbox_copy(&save_ctx, mail) < 0 && !mail->expunged) { |
8553
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
66 (void)mail_storage_get_last_error(destbox->storage, |
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
67 &error); |
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
68 /* if we failed because of out of disk space, just |
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
69 move those messages we managed to move so far. */ |
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
70 if (error != MAIL_ERROR_NOSPACE) |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 ret = -1; |
8553
e8a8383895df
mbox-snarf plugin: If copying failed due to out of disk space, don't rollback the entire move.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
72 break; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 mail_expunge(mail); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 mail_free(&mail); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 if (mailbox_search_deinit(&search_ctx) < 0) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 ret = -1; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 /* commit the copied messages to the destination mailbox. if we crash |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 between that and between expunging the messages from the source |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 mailbox, we're left with duplicates. */ |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 if (ret < 0) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 mailbox_transaction_rollback(&dest_trans); |
6512
1a3604c8ee05
mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents:
6463
diff
changeset
|
86 else if (mailbox_transaction_commit(&dest_trans) < 0) |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 ret = -1; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 if (ret < 0) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 mailbox_transaction_rollback(&src_trans); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 else { |
6512
1a3604c8ee05
mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents:
6463
diff
changeset
|
92 if (mailbox_transaction_commit(&src_trans) < 0) |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 ret = -1; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 } |
8021
1f20b78f37d7
mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
95 if (ret == 0) { |
1f20b78f37d7
mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
96 if (mailbox_sync(srcbox, 0, 0, NULL) < 0) |
1f20b78f37d7
mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
97 ret = -1; |
1f20b78f37d7
mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
98 } |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return ret; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 static struct mailbox_sync_context * |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 mbox_snarf_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 struct mbox_snarf_mail_storage *mstorage = |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 MBOX_SNARF_CONTEXT(box->storage); |
8468
d4eab639c253
mailbox_open() now takes struct mail_storage ** so it can be changed.
Timo Sirainen <tss@iki.fi>
parents:
8404
diff
changeset
|
107 struct mail_storage *storage; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 struct mbox_snarf_mailbox *mbox = MBOX_SNARF_CONTEXT(box); |
9330
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
109 struct mailbox *spool_mbox; |
9331 | 110 struct mailbox_sync_context *ctx; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
9330
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
112 /* try to open the spool mbox */ |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
113 mstorage->open_spool_inbox = TRUE; |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
114 storage = box->storage; |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
115 spool_mbox = mailbox_open(&storage, "INBOX", NULL, |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
116 MAILBOX_OPEN_KEEP_LOCKED | |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
117 MAILBOX_OPEN_KEEP_RECENT | |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
118 MAILBOX_OPEN_NO_INDEX_FILES); |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
119 mstorage->open_spool_inbox = FALSE; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
9330
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
121 if (spool_mbox != NULL) |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
122 mbox_snarf(spool_mbox, box); |
9007
66b6cd495702
mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents:
8726
diff
changeset
|
123 |
9330
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
124 ctx = mbox->module_ctx.super.sync_init(box, flags); |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
125 |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
126 if (spool_mbox != NULL) |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
127 mailbox_close(&spool_mbox); |
cf93e420fc57
mbox-snarf: Keep the mailbox locked while snarfing to avoid duplicates.
Timo Sirainen <tss@iki.fi>
parents:
9007
diff
changeset
|
128 return ctx; |
9007
66b6cd495702
mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents:
8726
diff
changeset
|
129 } |
66b6cd495702
mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents:
8726
diff
changeset
|
130 |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 static struct mailbox * |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 mbox_snarf_mailbox_open(struct mail_storage *storage, const char *name, |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 struct istream *input, enum mailbox_open_flags flags) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 struct mbox_snarf_mail_storage *mstorage = |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 MBOX_SNARF_CONTEXT(storage); |
6249 | 137 struct mailbox_list *list; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 struct mailbox *box; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 struct mbox_snarf_mailbox *mbox; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 struct stat st; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 enum mail_storage_flags old_flags = storage->flags; |
6249 | 142 enum mailbox_list_flags old_list_flags; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 bool use_snarfing = FALSE; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 |
6249 | 145 list = mail_storage_get_list(storage); |
146 old_list_flags = list->flags; | |
147 | |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 if (strcasecmp(name, "INBOX") == 0 && !mstorage->open_spool_inbox) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (stat(mstorage->snarf_inbox_path, &st) == 0) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 /* use ~/mbox as the INBOX */ |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 name = mstorage->snarf_inbox_path; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 use_snarfing = TRUE; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 storage->flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS; |
6249 | 154 list->flags |= MAILBOX_LIST_FLAG_FULL_FS_ACCESS; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } else if (errno != ENOENT) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 mail_storage_set_critical(storage, |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 "stat(%s) failed: %m", |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 mstorage->snarf_inbox_path); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 box = mstorage->module_ctx.super. |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 mailbox_open(storage, name, input, flags); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 storage->flags = old_flags; |
6249 | 165 list->flags = old_list_flags; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 if (box == NULL || !use_snarfing) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 return box; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 mbox = p_new(box->pool, struct mbox_snarf_mailbox, 1); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 mbox->module_ctx.super = box->v; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 box->v.sync_init = mbox_snarf_sync_init; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 MODULE_CONTEXT_SET(box, mbox_snarf_storage_module, mbox); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 return box; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 static void mbox_snarf_mail_storage_created(struct mail_storage *storage) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 struct mbox_snarf_mail_storage *mstorage; |
8137
b2a258213ee0
Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents:
8021
diff
changeset
|
181 const char *path; |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
8137
b2a258213ee0
Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents:
8021
diff
changeset
|
183 path = mail_user_home_expand(storage->ns->user, getenv("MBOX_SNARF")); |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 mstorage = p_new(storage->pool, struct mbox_snarf_mail_storage, 1); |
8137
b2a258213ee0
Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents:
8021
diff
changeset
|
185 mstorage->snarf_inbox_path = p_strdup(storage->pool, path); |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 mstorage->module_ctx.super = storage->v; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 storage->v.mailbox_open = mbox_snarf_mailbox_open; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 MODULE_CONTEXT_SET(storage, mbox_snarf_storage_module, mstorage); |
7462
068f6eefc62b
next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
190 |
068f6eefc62b
next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
191 if (mbox_snarf_next_hook_mail_storage_created != NULL) |
068f6eefc62b
next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
192 mbox_snarf_next_hook_mail_storage_created(storage); |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 void mbox_snarf_plugin_init(void) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 const char *path; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 path = getenv("MBOX_SNARF"); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 if (path != NULL) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 mbox_snarf_next_hook_mail_storage_created = |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 hook_mail_storage_created; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 hook_mail_storage_created = mbox_snarf_mail_storage_created; |
8404
d3cbd3494a8c
Plugins: If mail_debug=yes, log "plugin disabled" if plugin's required setting isn't set.
Timo Sirainen <tss@iki.fi>
parents:
8137
diff
changeset
|
204 } else if (getenv("DEBUG") != NULL) |
d3cbd3494a8c
Plugins: If mail_debug=yes, log "plugin disabled" if plugin's required setting isn't set.
Timo Sirainen <tss@iki.fi>
parents:
8137
diff
changeset
|
205 i_info("mbox_snarf: No mbox_snarf setting - plugin disabled"); |
5633
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 void mbox_snarf_plugin_deinit(void) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 if (getenv("MBOX_SNARF") != NULL) { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 hook_mail_storage_created = |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 mbox_snarf_next_hook_mail_storage_created; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |