annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 9007:66b6cd495702 HEAD

mbox-snarf plugin: Fixed memory/io leaking.
author Timo Sirainen <tss@iki.fi>
date Fri, 01 May 2009 14:53:52 -0400
parents 68db63cc32b3
children cf93e420fc57
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8553
diff changeset
1 /* Copyright (c) 2007-2009 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;
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
43 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
44 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
45 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
46 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
47
6463
aeee5076f99f Use mailbox_sync() instead of our own implementation.
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
48 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
49 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
50
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 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
52 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
53 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
54
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_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
56 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
57 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
58 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
59
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 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
61 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
62 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
63 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
64 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
65
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
66 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
67 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
68 (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
69 &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
70 /* 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
71 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
72 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
73 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
74 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
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_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
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 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
79
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 (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
81 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
82
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 /* 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
84 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
85 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
86 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
87 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
88 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
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
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 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
92 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
93 else {
6512
1a3604c8ee05 mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents: 6463
diff changeset
94 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
95 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
96 }
8021
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
97 if (ret == 0) {
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
98 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
99 ret = -1;
1f20b78f37d7 mbox-snarf: Messages weren't sometimes expunged from the source mbox,
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
100 }
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
101 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
102 }
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
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 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
105 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
106 {
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 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
108 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
109 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
110 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
111
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 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
113 /* 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
114 mstorage->open_spool_inbox = TRUE;
8468
d4eab639c253 mailbox_open() now takes struct mail_storage ** so it can be changed.
Timo Sirainen <tss@iki.fi>
parents: 8404
diff changeset
115 storage = box->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
116 mbox->spool_mbox =
8468
d4eab639c253 mailbox_open() now takes struct mail_storage ** so it can be changed.
Timo Sirainen <tss@iki.fi>
parents: 8404
diff changeset
117 mailbox_open(&storage, "INBOX", NULL,
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
118 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
119 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
120 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
121 }
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
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 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
124 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
125
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 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
127 }
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
9007
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
129 static int mbox_snarf_close(struct mailbox *box)
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
130 {
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
131 struct mbox_snarf_mailbox *mbox = MBOX_SNARF_CONTEXT(box);
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
132
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
133 if (mbox->spool_mbox != NULL)
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
134 mailbox_close(&mbox->spool_mbox);
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
135 return mbox->module_ctx.super.close(box);
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
136 }
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
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 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
139 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
140 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
141 {
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 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
143 MBOX_SNARF_CONTEXT(storage);
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
144 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
145 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
146 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
147 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
148 enum mail_storage_flags old_flags = storage->flags;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
149 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
150 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
151
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
152 list = mail_storage_get_list(storage);
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
153 old_list_flags = list->flags;
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
154
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 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
156 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
157 /* 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
158 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
159 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
160 storage->flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
161 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
162 } 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
163 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
164 "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
165 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
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
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 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
170 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
171 storage->flags = old_flags;
6249
2ebca5088938 Crashfixes
Timo Sirainen <tss@iki.fi>
parents: 5633
diff changeset
172 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
173
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 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
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 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
178 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
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 box->v.sync_init = mbox_snarf_sync_init;
9007
66b6cd495702 mbox-snarf plugin: Fixed memory/io leaking.
Timo Sirainen <tss@iki.fi>
parents: 8726
diff changeset
181 box->v.close = mbox_snarf_close;
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 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
183 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
184 }
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 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
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 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
189 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
190
8137
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8021
diff changeset
191 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
192 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
193 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
194 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
195 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
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 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
198
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
199 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
200 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
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
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 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
204 {
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 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
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 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
208 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
209 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
210 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
211 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
212 } 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
213 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
214 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 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
217 {
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 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
219 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
220 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
221 }
fbb4bdbbf374 Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }