Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/convert/convert-storage.c @ 5535:7aa36ab24c3b HEAD
Changed convert_skip_dotfiles to convert_skip_dotdirs.
convert_skip_broken_mailboxes=yes is enough to skip non-mbox dotfiles.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 10 Apr 2007 17:37:19 +0300 |
parents | c69786bd2017 |
children | 54babfeab440 |
rev | line source |
---|---|
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2006 Timo Sirainen */ |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
4 #include "file-lock.h" |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "file-dotlock.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
6 #include "mail-storage-private.h" |
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
7 #include "mail-namespace.h" |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-search.h" |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "convert-storage.h" |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <stdio.h> |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
3973 | 13 #define CONVERT_LOCK_FILENAME ".dovecot.convert" |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
15 struct dotlock_settings dotlock_settings = { |
3981
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
16 MEMBER(temp_prefix) NULL, |
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
17 MEMBER(lock_suffix) NULL, |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
3981
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
19 MEMBER(timeout) 60*5, |
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
20 MEMBER(stale_timeout) 60*5, |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
3981
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
22 MEMBER(callback) NULL, |
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
23 MEMBER(context) NULL, |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
3981
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
25 MEMBER(use_excl_lock) FALSE |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 }; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 static int sync_mailbox(struct mailbox *box) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct mailbox_sync_context *ctx; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct mailbox_sync_rec sync_rec; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 ctx = mailbox_sync_init(box, MAILBOX_SYNC_FLAG_FULL_READ); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 while (mailbox_sync_next(ctx, &sync_rec) > 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 ; |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
36 return mailbox_sync_deinit(&ctx, 0, NULL); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
3983
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
39 static int mailbox_copy_mails(struct mailbox *srcbox, struct mailbox *destbox, |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
40 struct dotlock *dotlock) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 struct mail_search_context *ctx; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct mailbox_transaction_context *src_trans, *dest_trans; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 struct mail *mail; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 struct mail_search_arg search_arg; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (sync_mailbox(srcbox) < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 memset(&search_arg, 0, sizeof(search_arg)); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 search_arg.type = SEARCH_ALL; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 src_trans = mailbox_transaction_begin(srcbox, 0); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 dest_trans = mailbox_transaction_begin(destbox, |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 MAILBOX_TRANSACTION_FLAG_EXTERNAL); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 ctx = mailbox_search_init(src_trans, NULL, &search_arg, NULL); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 mail = mail_alloc(src_trans, |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 MAIL_FETCH_FLAGS | MAIL_FETCH_RECEIVED_DATE | |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 MAIL_FETCH_STREAM_HEADER | MAIL_FETCH_STREAM_BODY | |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 MAIL_FETCH_FROM_ENVELOPE, NULL); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 while (mailbox_search_next(ctx, mail) > 0) { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 struct mail_keywords *keywords; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 const char *const *keywords_list; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
3983
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
67 if ((mail->seq % 100) == 0) { |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
68 /* touch the lock file so that if there are tons of |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
69 mails another process won't override our lock. */ |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
70 (void)file_dotlock_touch(dotlock); |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
71 } |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
72 |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 keywords_list = mail_get_keywords(mail); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 keywords = strarray_length(keywords_list) == 0 ? NULL : |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 mailbox_keywords_create(dest_trans, keywords_list); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 ret = mailbox_copy(dest_trans, mail, mail_get_flags(mail), |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 keywords, NULL); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 mailbox_keywords_free(dest_trans, &keywords); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 if (ret < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 break; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 mail_free(&mail); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 if (mailbox_search_deinit(&ctx) < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 ret = -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (ret < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 mailbox_transaction_rollback(&dest_trans); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 else |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 ret = mailbox_transaction_commit(&dest_trans, 0); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 /* source transaction committing isn't all that important. |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 ignore if it fails. */ |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (ret < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 mailbox_transaction_rollback(&src_trans); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 else |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 (void)mailbox_transaction_commit(&src_trans, 0); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
102 static const char *storage_error(struct mail_storage *storage) |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
103 { |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
104 bool syntax, temp; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
105 |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
106 return mail_storage_get_last_error(storage, &syntax, &temp); |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
107 } |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
108 |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
109 static const char * |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
110 mailbox_name_convert(struct mail_storage *dest_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
111 struct mail_storage *source_storage, |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
112 const struct convert_settings *set, const char *name) |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
113 { |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
114 char *dest_name, *p, src_sep, dest_sep; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
115 |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
116 src_sep = mail_storage_get_hierarchy_sep(source_storage); |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
117 dest_sep = mail_storage_get_hierarchy_sep(dest_storage); |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
118 |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
119 dest_name = t_strdup_noconst(name); |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
120 for (p = dest_name; *p != '\0'; p++) { |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
121 if (*p == dest_sep) |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
122 *p = set->alt_hierarchy_char; |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
123 if (*p == src_sep) |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
124 *p = dest_sep; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
125 } |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
126 return dest_name; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
127 } |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
128 |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 static int mailbox_convert_list_item(struct mail_storage *source_storage, |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 struct mail_storage *dest_storage, |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
131 struct mailbox_info *info, |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
132 struct dotlock *dotlock, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
133 const struct convert_settings *set) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 { |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
135 const char *name, *dest_name; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 struct mailbox *srcbox, *destbox; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
139 if ((info->flags & MAILBOX_NONEXISTENT) != 0) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
142 name = strcasecmp(info->name, "INBOX") == 0 ? "INBOX" : info->name; |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
143 if ((info->flags & MAILBOX_NOSELECT) != 0) { |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
144 /* \NoSelect mailbox, so it's probably a "directory" */ |
5535
7aa36ab24c3b
Changed convert_skip_dotfiles to convert_skip_dotdirs.
Timo Sirainen <tss@iki.fi>
parents:
5534
diff
changeset
|
145 if (*info->name == '.' && set->skip_dotdirs) |
7aa36ab24c3b
Changed convert_skip_dotfiles to convert_skip_dotdirs.
Timo Sirainen <tss@iki.fi>
parents:
5534
diff
changeset
|
146 return 0; |
7aa36ab24c3b
Changed convert_skip_dotfiles to convert_skip_dotdirs.
Timo Sirainen <tss@iki.fi>
parents:
5534
diff
changeset
|
147 |
5292
cf3d2b1eb7cb
Mailbox name conversion wasn't done for directories.
Timo Sirainen <tss@iki.fi>
parents:
5227
diff
changeset
|
148 dest_name = mailbox_name_convert(dest_storage, source_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
149 set, name); |
5292
cf3d2b1eb7cb
Mailbox name conversion wasn't done for directories.
Timo Sirainen <tss@iki.fi>
parents:
5227
diff
changeset
|
150 if (mail_storage_mailbox_create(dest_storage, dest_name, |
cf3d2b1eb7cb
Mailbox name conversion wasn't done for directories.
Timo Sirainen <tss@iki.fi>
parents:
5227
diff
changeset
|
151 TRUE) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 i_error("Mailbox conversion: Couldn't create mailbox " |
5292
cf3d2b1eb7cb
Mailbox name conversion wasn't done for directories.
Timo Sirainen <tss@iki.fi>
parents:
5227
diff
changeset
|
153 "directory %s", dest_name); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
159 /* First open the source mailbox. If we can't open it, don't create |
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
160 the destination mailbox either. */ |
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
161 srcbox = mailbox_open(source_storage, name, NULL, |
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
162 MAILBOX_OPEN_READONLY | MAILBOX_OPEN_KEEP_RECENT); |
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
163 if (srcbox == NULL) { |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
164 if (set->skip_broken_mailboxes) |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
165 return 0; |
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
166 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
167 i_error("Mailbox conversion: " |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
168 "Couldn't open source mailbox %s: %s", |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
169 name, storage_error(source_storage)); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
173 /* Create and open the destination mailbox. */ |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
174 dest_name = mailbox_name_convert(dest_storage, source_storage, |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
175 set, name); |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
176 if (mail_storage_mailbox_create(dest_storage, dest_name, FALSE) < 0) { |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
177 i_error("Mailbox conversion: Couldn't create mailbox %s: %s", |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
178 dest_name, storage_error(dest_storage)); |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
179 mailbox_close(&srcbox); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
183 destbox = mailbox_open(dest_storage, dest_name, NULL, |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 MAILBOX_OPEN_KEEP_RECENT); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 if (destbox == NULL) { |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
186 i_error("Mailbox conversion: Couldn't open dest mailbox %s: %s", |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
187 dest_name, storage_error(dest_storage)); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 mailbox_close(&srcbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
3983
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
192 if (mailbox_copy_mails(srcbox, destbox, dotlock) < 0) { |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
193 i_error("Mailbox conversion: Couldn't copy mailbox %s: %s", |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
194 mailbox_get_name(srcbox), storage_error(dest_storage)); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 mailbox_close(&srcbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 mailbox_close(&destbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 static int mailbox_list_copy(struct mail_storage *source_storage, |
3983
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
203 struct mail_storage *dest_storage, |
4860
87ae4d41bc10
Create storages with MAIL_STORAGE_FLAG_NO_AUTOCREATE flag so we don't keep
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
204 struct dotlock *dotlock, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
205 const struct convert_settings *set) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
207 struct mailbox_list_iterate_context *iter; |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
208 struct mailbox_info *info; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
211 iter = mailbox_list_iter_init(mail_storage_get_list(source_storage), |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
212 "*", MAILBOX_LIST_ITER_FAST_FLAGS); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
213 while ((info = mailbox_list_iter_next(iter)) != NULL) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 if (mailbox_convert_list_item(source_storage, dest_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
215 info, dotlock, set) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 ret = -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 break; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 } |
3983
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
219 |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
220 /* In case there are lots of mailboxes. Also the other touch |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
221 is done only after 100 mails. */ |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
222 (void)file_dotlock_touch(dotlock); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
224 if (mailbox_list_iter_deinit(&iter) < 0) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 ret = -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 |
4339 | 229 static int mailbox_list_copy_subscriptions(struct mail_storage *source_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
230 struct mail_storage *dest_storage, |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
231 const struct convert_settings *set) |
4339 | 232 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
233 struct mailbox_list_iterate_context *iter; |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
234 struct mailbox_info *info; |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
235 struct mailbox_list *dest_list; |
5530
eaea98799f5a
Mailbox names weren't converted in subscription list.
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
236 const char *dest_name; |
4339 | 237 int ret = 0; |
238 | |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
239 dest_list = mail_storage_get_list(dest_storage); |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
240 iter = mailbox_list_iter_init(mail_storage_get_list(source_storage), |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
241 "*", MAILBOX_LIST_ITER_SUBSCRIBED | |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
242 MAILBOX_LIST_ITER_FAST_FLAGS); |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
243 while ((info = mailbox_list_iter_next(iter)) != NULL) { |
5530
eaea98799f5a
Mailbox names weren't converted in subscription list.
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
244 dest_name = mailbox_name_convert(dest_storage, source_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
245 set, info->name); |
5530
eaea98799f5a
Mailbox names weren't converted in subscription list.
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
246 if (mailbox_list_set_subscribed(dest_list, dest_name, |
4339 | 247 TRUE) < 0) { |
248 ret = -1; | |
249 break; | |
250 } | |
251 } | |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
252 if (mailbox_list_iter_deinit(&iter) < 0) |
4339 | 253 ret = -1; |
254 return ret; | |
255 } | |
256 | |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
257 int convert_storage(const char *source_data, const char *dest_data, |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
258 const struct convert_settings *set) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 { |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
260 struct mail_namespace *source_ns, *dest_ns; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 struct dotlock *dotlock; |
5531
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
262 enum mail_storage_flags src_flags, dest_flags; |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4860
diff
changeset
|
263 enum file_lock_method lock_method; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 const char *path; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 int ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
267 source_ns = mail_namespaces_init_empty(pool_datastack_create()); |
5531
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
268 mail_storage_parse_env(&src_flags, &lock_method); |
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
269 src_flags |= MAIL_STORAGE_FLAG_HAS_INBOX; |
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
270 dest_flags = src_flags; |
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
271 |
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
272 src_flags |= MAIL_STORAGE_FLAG_NO_AUTOCREATE; |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
273 if (mail_storage_create(source_ns, NULL, source_data, set->user, |
5531
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
274 src_flags, lock_method) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 /* No need for conversion. */ |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 |
5533
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
279 /* If home directory doesn't exist, creating the destination storage |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
280 will most likely create it. So do this before locking. */ |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
281 dest_ns = mail_namespaces_init_empty(pool_datastack_create()); |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
282 if (mail_storage_create(dest_ns, NULL, dest_data, set->user, |
5533
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
283 dest_flags, lock_method) < 0) { |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
284 i_error("Mailbox conversion: Failed to create destination " |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
285 "storage with data: %s", dest_data); |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
286 mail_namespaces_deinit(&dest_ns); |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
287 mail_namespaces_deinit(&source_ns); |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
288 return -1; |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
289 } |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
290 |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
291 path = t_strconcat(set->home, "/"CONVERT_LOCK_FILENAME, NULL); |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
292 dotlock_settings.use_excl_lock = |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
293 (source_ns->storage->flags & |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
294 MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 ret = file_dotlock_create(&dotlock_settings, path, 0, &dotlock); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 if (ret <= 0) { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 if (ret == 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 i_error("Mailbox conversion: Lock creation timeouted"); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 |
3973 | 302 /* just in case if another process just had converted the mailbox, |
303 reopen the source storage */ | |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
304 mail_storage_destroy(&source_ns->storage); |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
305 if (mail_storage_create(source_ns, NULL, source_data, set->user, |
5531
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
306 src_flags, lock_method) < 0) { |
3973 | 307 /* No need for conversion anymore. */ |
308 file_dotlock_delete(&dotlock); | |
309 return 0; | |
310 } | |
311 | |
5533
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
312 ret = mailbox_list_copy(source_ns->storage, dest_ns->storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
313 dotlock, set); |
5533
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
314 if (ret == 0) { |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
315 ret = mailbox_list_copy_subscriptions(source_ns->storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
316 dest_ns->storage, set); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 if (ret == 0) { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 /* all finished. rename the source directory to mark the |
4041
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
321 move as finished. */ |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
322 const char *src, *dest; |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
323 bool is_file; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
325 src = mail_storage_get_mailbox_path(source_ns->storage, "", |
4041
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
326 &is_file); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
327 if (src != NULL) { |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
328 dest = t_strconcat(src, "-converted", NULL); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
329 if (rename(src, dest) < 0) { |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
330 i_error("Mailbox conversion: " |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
331 "rename(%s, %s) failed: %m", src, dest); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
332 /* return success anyway */ |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
333 } |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 ret = 1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 |
3973 | 338 file_dotlock_delete(&dotlock); |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
339 mail_namespaces_deinit(&dest_ns); |
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
340 mail_namespaces_deinit(&source_ns); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 } |