Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/mbox-snarf/mbox-snarf-plugin.c @ 6249:2ebca5088938 HEAD
Crashfixes
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 09 Aug 2007 19:27:57 +0300 |
parents | fbb4bdbbf374 |
children | f52e7d1402b5 |
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" |
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 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
|
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 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
|
41 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
|
42 |
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 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
|
44 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
|
45 ; |
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 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
|
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 |
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 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
|
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 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
|
52 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
|
53 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
|
54 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
|
55 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
|
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 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
|
58 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
|
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 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
|
61 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
|
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 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
|
64 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
|
65 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
|
66 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
|
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 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 if (mailbox_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
|
75 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
|
76 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
|
77 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
|
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 } |
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 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
|
81 } |
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 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
|
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 (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
|
85 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
|
86 |
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 /* 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 ret = -1; |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
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 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 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); |
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 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
|
110 |
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 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
|
112 /* 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 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
|
119 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 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
|
122 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
|
123 |
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 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
|
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 |
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 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
|
128 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
|
129 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
|
130 { |
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 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
|
132 MBOX_SNARF_CONTEXT(storage); |
6249 | 133 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
|
134 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
|
135 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
|
136 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
|
137 enum mail_storage_flags old_flags = storage->flags; |
6249 | 138 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
|
139 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
|
140 |
6249 | 141 list = mail_storage_get_list(storage); |
142 old_list_flags = list->flags; | |
143 | |
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
|
144 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
|
145 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
|
146 /* 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
|
147 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
|
148 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
|
149 storage->flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS; |
6249 | 150 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
|
151 } 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
|
152 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
|
153 "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
|
154 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
|
155 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 |
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 = 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
|
159 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
|
160 storage->flags = old_flags; |
6249 | 161 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
|
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 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
|
164 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
|
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 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
|
167 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
|
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->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
|
170 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
|
171 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
|
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 |
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 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
|
175 { |
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 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
|
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 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
|
179 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
|
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 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
|
182 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
|
183 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
|
184 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
|
185 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
|
186 |
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 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
|
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 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
|
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 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
|
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 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
|
195 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
|
196 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
|
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 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
|
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 } |
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 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
|
203 { |
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 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
|
205 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
|
206 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
|
207 } |
fbb4bdbbf374
Added mbox snarf plugin to move mails from /var/spool/mail to ~/mbox if it
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 } |