Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 7462:068f6eefc62b HEAD
next_hook should be called after our hook is finished with its doings, that
way they get executed in the intended order. This should fix some problems
when multiple plugins are used.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 25 Apr 2008 01:31:05 +0300 |
parents | 7ed926ed7aa4 |
children | 8e206e25a142 |
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" |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mail-search.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
|
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 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 { |
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 mail_search_arg search_arg; |
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 memset(&search_arg, 0, sizeof(search_arg)); |
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 search_arg.type = SEARCH_ALL; |
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 |
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 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
|
53 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
|
54 MAILBOX_TRANSACTION_FLAG_EXTERNAL); |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 search_ctx = mailbox_search_init(src_trans, NULL, &search_arg, 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
|
56 |
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 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 |
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 (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
|
64 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
|
65 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
|
66 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
|
67 } |
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 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
|
70 } |
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 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
|
72 |
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 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
|
74 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
|
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 /* 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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 |
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(&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
|
86 else { |
6512
1a3604c8ee05
mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents:
6463
diff
changeset
|
87 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
|
88 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
|
89 } |
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 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
|
91 } |
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 |
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 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
|
94 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
|
95 { |
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 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
|
97 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
|
98 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
|
99 |
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 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
|
101 /* 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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 } |
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 |
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 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
|
111 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
|
112 |
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 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
|
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 |
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 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
|
117 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
|
118 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
|
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 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
|
121 MBOX_SNARF_CONTEXT(storage); |
6249 | 122 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
|
123 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
|
124 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
|
125 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
|
126 enum mail_storage_flags old_flags = storage->flags; |
6249 | 127 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
|
128 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
|
129 |
6249 | 130 list = mail_storage_get_list(storage); |
131 old_list_flags = list->flags; | |
132 | |
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 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
|
134 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
|
135 /* 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
|
136 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
|
137 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
|
138 storage->flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS; |
6249 | 139 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
|
140 } 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
|
141 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
|
142 "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
|
143 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
|
144 } |
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 } |
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 |
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 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
|
148 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
|
149 storage->flags = old_flags; |
6249 | 150 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
|
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 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
|
153 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
|
154 |
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 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
|
156 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
|
157 |
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 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
|
159 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
|
160 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
|
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 |
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 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
|
164 { |
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 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
|
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 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
|
168 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
|
169 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
|
170 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
|
171 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
|
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 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
|
174 |
068f6eefc62b
next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
175 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
|
176 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
|
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 |
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 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
|
180 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 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
|
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 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
|
184 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
|
185 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
|
186 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
|
187 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
|
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 } |
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 |
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 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
|
192 { |
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 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
|
194 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
|
195 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
|
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 } |