Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 5633:fbb4bdbbf374 HEAD
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
exists.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 17 May 2007 20:25:26 +0300 |
parents | |
children | 2ebca5088938 |
rev | line source |
---|---|
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
|
1 /* Copyright (C) 2007 Timo Sirainen */ |
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" |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #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
|
9 |
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 #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
|
11 #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
|
12 |
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 #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
|
14 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
|
15 |
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 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
|
17 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
|
18 |
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 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
|
20 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
|
21 }; |
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 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
|
24 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
|
25 |
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 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
|
27 }; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
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 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
|
30 |
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 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
|
32 (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
|
33 |
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 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
|
35 &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
|
36 |
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 static int sync_mailbox(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
|
38 { |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct mailbox_sync_context *ctx; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct mailbox_sync_rec sync_rec; |
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 |
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 ctx = mailbox_sync_init(box, MAILBOX_SYNC_FLAG_FULL_READ); |
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 while (mailbox_sync_next(ctx, &sync_rec) > 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
|
44 ; |
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 return mailbox_sync_deinit(&ctx, 0, 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
|
46 } |
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 |
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 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
|
49 { |
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 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
|
51 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
|
52 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
|
53 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
|
54 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
|
55 |
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 if (sync_mailbox(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
|
57 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
|
58 |
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 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
|
60 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
|
61 |
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 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
|
63 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
|
64 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
|
65 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
|
66 |
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 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
|
68 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
|
69 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
|
70 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
|
71 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
|
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_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
|
74 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
|
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 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
|
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 } |
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 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
|
80 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 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
|
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 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
|
84 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
|
85 |
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 /* 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
|
87 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
|
88 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
|
89 if (ret < 0) |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 mailbox_transaction_rollback(&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
|
91 else if (mailbox_transaction_commit(&dest_trans, 0) < 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 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
|
93 |
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 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
|
95 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
|
96 else { |
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 if (mailbox_transaction_commit(&src_trans, 0) < 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
|
98 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
|
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 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
|
101 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
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 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
|
104 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
|
105 { |
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 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
|
107 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
|
108 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
|
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 /* 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
|
112 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 } |
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 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
|
121 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
|
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 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
|
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 |
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 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
|
127 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
|
128 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
|
129 { |
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 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
|
131 MBOX_SNARF_CONTEXT(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
|
132 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
|
133 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
|
134 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
|
135 enum mail_storage_flags old_flags = storage->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
|
136 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
|
137 |
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; |
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 } 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
|
145 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
|
146 "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
|
147 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
|
148 } |
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 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
|
152 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
|
153 storage->flags = old_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 |
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 (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
|
156 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
|
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 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
|
159 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
|
160 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 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
|
162 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
|
163 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
|
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 |
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 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
|
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 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
|
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 if (mbox_snarf_next_hook_mail_storage_created != 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
|
171 mbox_snarf_next_hook_mail_storage_created(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
|
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 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
|
174 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
|
175 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
|
176 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
|
177 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
|
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 MODULE_CONTEXT_SET(storage, mbox_snarf_storage_module, 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
|
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 |
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 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
|
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 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
|
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 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 } |
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 |
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 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
|
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 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
|
197 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
|
198 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
|
199 } |
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 } |