annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 8021:1f20b78f37d7 HEAD

mbox-snarf: Messages weren't sometimes expunged from the source mbox, causing duplicates.
author Timo Sirainen <tss@iki.fi>
date Sun, 20 Jul 2008 18:40:17 +0300
parents 8e206e25a142
children b2a258213ee0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7086
7ed926ed7aa4 Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents: 6512
diff changeset
1 /* Copyright (c) 2007-2008 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
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
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 struct mailbox *spool_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
28 };
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 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
31
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 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
33 (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
34
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 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
36 &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
37
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 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
39 {
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
40 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
41 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
42 struct mailbox_transaction_context *src_trans, *dest_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
43 struct mail *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
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
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 if (mailbox_copy(dest_trans, mail, 0, NULL, NULL) < 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
65 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
66 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
67 break;
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 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
71 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 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
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 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
75 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
76
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 /* 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
78 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
79 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
80 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
81 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
82 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
83 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
84
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 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
86 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
87 else {
6512
1a3604c8ee05 mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents: 6463
diff changeset
88 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
89 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
90 }
8021
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
91 if (ret == 0) {
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
92 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
93 ret = -1;
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
94 }
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
95 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
96 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 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
99 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
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 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
102 MBOX_SNARF_CONTEXT(box->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
103 struct mbox_snarf_mailbox *mbox = MBOX_SNARF_CONTEXT(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
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 if (mbox->spool_mbox == 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
106 /* try to open the spool 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
107 mstorage->open_spool_inbox = 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
108 mbox->spool_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
109 mailbox_open(box->storage, "INBOX", 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
110 MAILBOX_OPEN_KEEP_RECENT |
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 MAILBOX_OPEN_NO_INDEX_FILES);
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 mstorage->open_spool_inbox = 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
113 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (mbox->spool_mbox != 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
116 mbox_snarf(mbox->spool_mbox, 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
117
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 return mbox->module_ctx.super.sync_init(box, 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
119 }
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
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 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
122 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
123 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
124 {
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 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
126 MBOX_SNARF_CONTEXT(storage);
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
127 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
128 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
129 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
130 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
131 enum mail_storage_flags old_flags = storage->flags;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
132 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
133 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
134
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
135 list = mail_storage_get_list(storage);
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
136 old_list_flags = list->flags;
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
137
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 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
139 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
140 /* 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
141 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
142 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
143 storage->flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
144 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
145 } 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
146 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
147 "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
148 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
149 }
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 }
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
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 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
153 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
154 storage->flags = old_flags;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
155 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
156
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 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
158 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
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 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
161 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
162
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 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
164 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
165 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
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
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 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
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 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
171
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 mstorage = p_new(storage->pool, struct mbox_snarf_mail_storage, 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
173 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
174 p_strdup(storage->pool, home_expand(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
175 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
176 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
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 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
179
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
180 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
181 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
182 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
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 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
185 {
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 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
187
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 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
189 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
190 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
191 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
192 hook_mail_storage_created = mbox_snarf_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
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
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 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
197 {
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 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
199 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
200 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
201 }
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 }