Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/convert/convert-storage.c @ 9089:b2b9cbe17d1b HEAD
convert plugin: Don't crash after finishing conversion.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 26 May 2009 00:38:36 -0400 |
parents | 616c0ee81222 |
children | a9f719f9a509 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8468
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
3972
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" |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
4 #include "str.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
5 #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
|
6 #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
|
7 #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
|
8 #include "mail-namespace.h" |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
9 #include "mail-search-build.h" |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #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
|
11 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdio.h> |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
13 #include <dirent.h> |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
3973 | 15 #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
|
16 |
8027
62cf70991cf2
extern/static fixes (from a sparse check by Diego Liziero)
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
17 static 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
|
18 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
|
19 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
|
20 |
3981
0d64f8888dcd
Removed immediate_stale_timeout and changed the stale_timeout behavior to
Timo Sirainen <tss@iki.fi>
parents:
3973
diff
changeset
|
21 MEMBER(timeout) 60*5, |
6592
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6512
diff
changeset
|
22 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
|
23 }; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
25 static const char *storage_error(struct mail_storage *storage) |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
26 { |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
27 enum mail_error error; |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
28 |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
29 return mail_storage_get_last_error(storage, &error); |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
30 } |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
31 |
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
|
32 static int mailbox_copy_mails(struct mailbox *srcbox, struct mailbox *destbox, |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
33 struct dotlock *dotlock, const char **error_r) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 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
|
36 struct mailbox_transaction_context *src_trans, *dest_trans; |
8726
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
37 struct mail_save_context *save_ctx; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct mail *mail; |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
39 struct mail_search_args *search_args; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
42 if (mailbox_sync(srcbox, MAILBOX_SYNC_FLAG_FULL_READ, 0, NULL) < 0) { |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
43 *error_r = storage_error(srcbox->storage); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 return -1; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
45 } |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
46 *error_r = NULL; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
48 search_args = mail_search_build_init(); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
49 mail_search_build_add_all(search_args); |
3972
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 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
|
52 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
|
53 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
|
54 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
55 ctx = mailbox_search_init(src_trans, search_args, NULL); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
56 mail_search_args_unref(&search_args); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
57 |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 |
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
|
66 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
|
67 /* 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
|
68 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
|
69 (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
|
70 } |
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 |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 keywords_list = mail_get_keywords(mail); |
6424
687efa138e77
Renamed strarray_length/remote() to str_array_length/remove()
Timo Sirainen <tss@iki.fi>
parents:
6354
diff
changeset
|
73 keywords = str_array_length(keywords_list) == 0 ? NULL : |
6354
8476d665530f
Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents:
6353
diff
changeset
|
74 mailbox_keywords_create_valid(destbox, keywords_list); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
8726
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
76 save_ctx = mailbox_save_alloc(dest_trans); |
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
77 mailbox_save_set_flags(save_ctx, mail_get_flags(mail), |
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
78 keywords); |
68db63cc32b3
Mail copying API changed to be based on save API. This allows extending it easily in future.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
79 ret = mailbox_copy(&save_ctx, mail); |
6354
8476d665530f
Changed mail_keywords creation APIs to take mailbox/index instead of
Timo Sirainen <tss@iki.fi>
parents:
6353
diff
changeset
|
80 mailbox_keywords_free(destbox, &keywords); |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
81 if (ret < 0) { |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
82 *error_r = storage_error(destbox->storage); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 break; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
84 } |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 mail_free(&mail); |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
88 if (mailbox_search_deinit(&ctx) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 ret = -1; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
90 *error_r = storage_error(srcbox->storage); |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
91 } |
3972
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 if (ret < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 mailbox_transaction_rollback(&dest_trans); |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
95 else { |
6512
1a3604c8ee05
mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents:
6463
diff
changeset
|
96 ret = mailbox_transaction_commit(&dest_trans); |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
97 if (ret < 0) |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
98 *error_r = storage_error(destbox->storage); |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
99 } |
3972
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 /* 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
|
102 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
|
103 if (ret < 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 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
|
105 else |
6512
1a3604c8ee05
mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents:
6463
diff
changeset
|
106 (void)mailbox_transaction_commit(&src_trans); |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
107 i_assert(ret == 0 || *error_r != NULL); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
111 static const char * |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
112 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
|
113 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
|
114 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
|
115 { |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
116 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
|
117 |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
118 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
|
119 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
|
120 |
9083
616c0ee81222
convert plugin: If alt_hierarchy_char isn't specified, don't truncate mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
8726
diff
changeset
|
121 if (src_sep == dest_sep || set->alt_hierarchy_char == '\0') |
6253
f108845caaa1
If both source and destination storage had the same separator, we changed
Timo Sirainen <tss@iki.fi>
parents:
6023
diff
changeset
|
122 return name; |
f108845caaa1
If both source and destination storage had the same separator, we changed
Timo Sirainen <tss@iki.fi>
parents:
6023
diff
changeset
|
123 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
124 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
|
125 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
|
126 if (*p == dest_sep) |
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
127 *p = set->alt_hierarchy_char; |
6253
f108845caaa1
If both source and destination storage had the same separator, we changed
Timo Sirainen <tss@iki.fi>
parents:
6023
diff
changeset
|
128 else if (*p == src_sep) |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
129 *p = dest_sep; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
130 } |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
131 return dest_name; |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
132 } |
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
133 |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
134 static int mailbox_convert_maildir_to_dbox(struct mail_storage *src_storage, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
135 struct mail_storage *dest_storage, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
136 const char *src_name, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
137 const char *dest_name) |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
138 { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
139 static const char *maildir_files[] = { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
140 "dovecot-uidlist", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
141 "dovecot-keywords", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
142 "dovecot.index", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
143 "dovecot.index.log", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
144 "dovecot.index.cache" |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
145 }; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
146 string_t *src, *dest; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
147 DIR *dir; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
148 struct dirent *dp; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
149 const char *src_path, *dest_path, *new_path, *cur_path; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
150 unsigned int i, src_dir_len, dest_dir_len; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
151 bool t; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
152 int ret; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
153 |
7586
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
154 /* create as non-selectable mailbox so the dbox-Mails directory |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
155 isn't created yet */ |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
156 if (mail_storage_mailbox_create(dest_storage, dest_name, TRUE) < 0) { |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
157 i_error("Mailbox conversion: " |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
158 "Couldn't create mailbox %s: %s", |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
159 dest_name, storage_error(dest_storage)); |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
160 return -1; |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
161 } |
40a660972c70
maildir -> dbox conversion: Create the destination mailbox so the conversion
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
162 |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
163 src_path = mail_storage_get_mailbox_path(src_storage, src_name, &t); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
164 dest_path = mail_storage_get_mailbox_path(dest_storage, dest_name, &t); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
165 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
166 /* rename cur/ directory as the destination directory */ |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
167 cur_path = t_strconcat(src_path, "/cur", NULL); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
168 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
169 if (rename(cur_path, dest_path) < 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
170 i_error("rename(%s, %s) failed: %m", cur_path, dest_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
171 return -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
172 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
173 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
174 /* move metadata files */ |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
175 src = t_str_new(256); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
176 str_printfa(src, "%s/", src_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
177 src_dir_len = str_len(src); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
178 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
179 dest = t_str_new(256); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
180 str_printfa(dest, "%s/", dest_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
181 dest_dir_len = str_len(dest); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
182 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
183 for (i = 0; i < N_ELEMENTS(maildir_files); i++) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
184 str_truncate(src, src_dir_len); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
185 str_truncate(dest, dest_dir_len); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
186 str_append(src, maildir_files[i]); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
187 str_append(dest, maildir_files[i]); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
188 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
189 if (rename(str_c(src), str_c(dest)) < 0 && errno != ENOENT) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
190 i_error("rename(%s, %s) failed: %m", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
191 str_c(src), str_c(dest)); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
192 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
193 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
194 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
195 /* move files in new/ */ |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
196 new_path = t_strconcat(src_path, "/new", NULL); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
197 str_truncate(src, src_dir_len); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
198 str_append(src, "new/"); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
199 src_dir_len = str_len(src); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
200 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
201 dir = opendir(new_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
202 if (dir == NULL) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
203 if (errno == ENOENT) |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
204 return 0; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
205 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
206 i_error("opendir(%s) failed: %m", new_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
207 return -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
208 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
209 ret = 0; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
210 errno = 0; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
211 while ((dp = readdir(dir)) != NULL) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
212 if (dp->d_name[0] == '.' && |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
213 (dp->d_name[1] == '\0' || |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
214 (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
215 continue; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
216 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
217 str_truncate(src, src_dir_len); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
218 str_truncate(dest, dest_dir_len); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
219 str_append(src, dp->d_name); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
220 str_append(dest, dp->d_name); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
221 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
222 if (strstr(dp->d_name, ":2,") == NULL) |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
223 str_append(dest, ":2,"); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
224 |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
225 if (rename(str_c(src), str_c(dest)) < 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
226 i_error("rename(%s, %s) failed: %m", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
227 str_c(src), str_c(dest)); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
228 ret = -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
229 errno = 0; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
230 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
231 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
232 if (errno != 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
233 i_error("readdir(%s) failed: %m", new_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
234 ret = -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
235 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
236 if (closedir(dir) < 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
237 i_error("closedir(%s) failed: %m", new_path); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
238 ret = -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
239 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
240 return ret; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
241 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
242 |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 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
|
244 struct mail_storage *dest_storage, |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
245 const 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
|
246 struct dotlock *dotlock, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
247 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
|
248 { |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
249 const char *name, *dest_name, *error; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 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
|
251 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
253 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
|
254 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
256 name = strcasecmp(info->name, "INBOX") == 0 ? "INBOX" : info->name; |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
257 dest_name = mailbox_name_convert(dest_storage, source_storage, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
258 set, name); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
259 |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
260 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
|
261 /* \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
|
262 if (*info->name == '.' && set->skip_dotdirs) |
7aa36ab24c3b
Changed convert_skip_dotfiles to convert_skip_dotdirs.
Timo Sirainen <tss@iki.fi>
parents:
5534
diff
changeset
|
263 return 0; |
7aa36ab24c3b
Changed convert_skip_dotfiles to convert_skip_dotdirs.
Timo Sirainen <tss@iki.fi>
parents:
5534
diff
changeset
|
264 |
5292
cf3d2b1eb7cb
Mailbox name conversion wasn't done for directories.
Timo Sirainen <tss@iki.fi>
parents:
5227
diff
changeset
|
265 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
|
266 TRUE) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 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
|
268 "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
|
269 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
274 if (strcmp(source_storage->name, "maildir") == 0 && |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
275 strcmp(dest_storage->name, "dbox") == 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
276 if (mailbox_convert_maildir_to_dbox(source_storage, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
277 dest_storage, |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
278 name, dest_name) < 0) { |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
279 i_error("Mailbox conversion failed for mailbox %s", |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
280 name); |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
281 return -1; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
282 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
283 return 0; |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
284 } |
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
285 |
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
|
286 /* 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
|
287 the destination mailbox either. */ |
8468
d4eab639c253
mailbox_open() now takes struct mail_storage ** so it can be changed.
Timo Sirainen <tss@iki.fi>
parents:
8467
diff
changeset
|
288 srcbox = mailbox_open(&source_storage, name, NULL, |
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
|
289 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
|
290 if (srcbox == NULL) { |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
291 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
|
292 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
|
293 |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
294 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
|
295 "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
|
296 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
|
297 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 |
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
|
300 /* Create and open the destination mailbox. */ |
5556
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
301 if (strcmp(dest_name, "INBOX") != 0) { |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
302 if (mail_storage_mailbox_create(dest_storage, dest_name, |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
303 FALSE) < 0) { |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
304 i_error("Mailbox conversion: " |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
305 "Couldn't create mailbox %s: %s", |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
306 dest_name, storage_error(dest_storage)); |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
307 mailbox_close(&srcbox); |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
308 return -1; |
54babfeab440
Don't create INBOX mailbox, so with maildir the maildirfolder file won't be
Timo Sirainen <tss@iki.fi>
parents:
5535
diff
changeset
|
309 } |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 |
8468
d4eab639c253
mailbox_open() now takes struct mail_storage ** so it can be changed.
Timo Sirainen <tss@iki.fi>
parents:
8467
diff
changeset
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 mailbox_close(&srcbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
321 if (mailbox_copy_mails(srcbox, destbox, dotlock, &error) < 0) { |
5227
7838ae62b1e6
Log errors given by storage. Convert hierarchy separators in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
322 i_error("Mailbox conversion: Couldn't copy mailbox %s: %s", |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
323 mailbox_get_name(srcbox), error); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 mailbox_close(&srcbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 mailbox_close(&destbox); |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 static int mailbox_list_copy(struct mail_storage *source_storage, |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
332 struct mail_namespace *dest_namespaces, |
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
|
333 struct dotlock *dotlock, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
334 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
|
335 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
336 struct mailbox_list_iterate_context *iter; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
337 struct mail_namespace *dest_ns; |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
338 const 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
|
339 int ret = 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
341 dest_ns = mail_namespace_find_inbox(dest_namespaces); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
342 iter = mailbox_list_iter_init(mail_storage_get_list(source_storage), |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
343 "*", MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
344 while ((info = mailbox_list_iter_next(iter)) != NULL) { |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
345 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
346 ret = mailbox_convert_list_item(source_storage, |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
347 dest_ns->storage, |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
348 info, dotlock, set); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
349 } T_END; |
6681
b502a4926298
Use a fast rename() method for maildir -> dbox conversion.
Timo Sirainen <tss@iki.fi>
parents:
6592
diff
changeset
|
350 if (ret < 0) |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 break; |
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
|
352 |
565e3040a9f5
Call file_dotlock_touch() once in a while so other process won't override
Timo Sirainen <tss@iki.fi>
parents:
3981
diff
changeset
|
353 /* 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
|
354 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
|
355 (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
|
356 } |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
357 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
|
358 ret = -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
362 static int |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
363 mailbox_list_copy_subscriptions(struct mail_storage *source_storage, |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
364 struct mail_namespace *dest_namespaces, |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
365 const struct convert_settings *set) |
4339 | 366 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
367 struct mailbox_list_iterate_context *iter; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
368 struct mail_namespace *dest_ns; |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
369 const struct mailbox_info *info; |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
370 struct mailbox_list *dest_list; |
5530
eaea98799f5a
Mailbox names weren't converted in subscription list.
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
371 const char *dest_name; |
4339 | 372 int ret = 0; |
373 | |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
374 dest_ns = mail_namespace_find_inbox(dest_namespaces); |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
375 dest_list = mail_storage_get_list(dest_ns->storage); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
376 iter = mailbox_list_iter_init(mail_storage_get_list(source_storage), |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
377 "*", MAILBOX_LIST_ITER_SELECT_SUBSCRIBED | |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
378 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
379 while ((info = mailbox_list_iter_next(iter)) != NULL) { |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
380 dest_name = mailbox_name_convert(dest_ns->storage, |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
381 source_storage, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
382 set, info->name); |
5530
eaea98799f5a
Mailbox names weren't converted in subscription list.
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
383 if (mailbox_list_set_subscribed(dest_list, dest_name, |
4339 | 384 TRUE) < 0) { |
385 ret = -1; | |
386 break; | |
387 } | |
388 } | |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4339
diff
changeset
|
389 if (mailbox_list_iter_deinit(&iter) < 0) |
4339 | 390 ret = -1; |
391 return ret; | |
392 } | |
393 | |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
394 int convert_storage(const char *source_data, |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
395 struct mail_namespace *dest_namespaces, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
396 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
|
397 { |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
398 struct mail_user *user = dest_namespaces->user; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
399 struct mail_namespace *source_ns, *dest_inbox_ns; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 struct dotlock *dotlock; |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
401 enum mail_storage_flags src_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
|
402 enum file_lock_method lock_method; |
8467
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
403 const char *home, *path, *error; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 int ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 |
9089
b2b9cbe17d1b
convert plugin: Don't crash after finishing conversion.
Timo Sirainen <tss@iki.fi>
parents:
9083
diff
changeset
|
406 i_assert(user->namespaces == dest_namespaces); |
8085
bf83aa9c3f4a
Removed pool parameter from mail_namespaces_init*(). Use mail_user's pool intead.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
407 source_ns = mail_namespaces_init_empty(user); |
9089
b2b9cbe17d1b
convert plugin: Don't crash after finishing conversion.
Timo Sirainen <tss@iki.fi>
parents:
9083
diff
changeset
|
408 user->namespaces = dest_namespaces; |
b2b9cbe17d1b
convert plugin: Don't crash after finishing conversion.
Timo Sirainen <tss@iki.fi>
parents:
9083
diff
changeset
|
409 |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
410 dest_inbox_ns = mail_namespace_find_inbox(dest_namespaces); |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
411 src_flags = dest_inbox_ns->storage->flags; |
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
412 lock_method = dest_inbox_ns->storage->lock_method; |
5531
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
413 |
435f61888541
If directory for destination storage doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
5530
diff
changeset
|
414 src_flags |= MAIL_STORAGE_FLAG_NO_AUTOCREATE; |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
415 if (mail_storage_create(source_ns, NULL, source_data, |
6023
56879cc53cec
mail_storage.create() now returns error message string. Also fixed handling
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
416 src_flags, lock_method, &error) < 0) { |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 /* 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
|
418 return 0; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 |
8467
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
421 if (mail_user_get_home(user, &home) <= 0) |
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
422 i_unreached(); |
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
423 path = t_strconcat(home, "/"CONVERT_LOCK_FILENAME, NULL); |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
424 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
|
425 (source_ns->storage->flags & |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
426 MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0; |
6592
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6512
diff
changeset
|
427 dotlock_settings.nfs_flush = |
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6512
diff
changeset
|
428 (source_ns->storage->flags & |
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6512
diff
changeset
|
429 MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0; |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 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
|
431 if (ret <= 0) { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 if (ret == 0) |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 i_error("Mailbox conversion: Lock creation timeouted"); |
6772
b78cfc60f6a1
Added missing error logging for file_dotlock_create/open calls.
Timo Sirainen <tss@iki.fi>
parents:
6681
diff
changeset
|
434 else |
b78cfc60f6a1
Added missing error logging for file_dotlock_create/open calls.
Timo Sirainen <tss@iki.fi>
parents:
6681
diff
changeset
|
435 i_error("file_dotlock_create(%s) failed: %m", path); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 return -1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 |
3973 | 439 /* just in case if another process just had converted the mailbox, |
440 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
|
441 mail_storage_destroy(&source_ns->storage); |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
442 if (mail_storage_create(source_ns, NULL, source_data, |
6023
56879cc53cec
mail_storage.create() now returns error message string. Also fixed handling
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
443 src_flags, lock_method, &error) < 0) { |
3973 | 444 /* No need for conversion anymore. */ |
445 file_dotlock_delete(&dotlock); | |
446 return 0; | |
447 } | |
448 | |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
449 ret = mailbox_list_copy(source_ns->storage, dest_namespaces, |
5534
c69786bd2017
Added convert_skip_dotfiles and convert_alt_hierarchy_char settings.
Timo Sirainen <tss@iki.fi>
parents:
5533
diff
changeset
|
450 dotlock, set); |
5533
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
451 if (ret == 0) { |
e607f517d08b
Create destination storage before locking home directory, so home dir is
Timo Sirainen <tss@iki.fi>
parents:
5531
diff
changeset
|
452 ret = mailbox_list_copy_subscriptions(source_ns->storage, |
6976
7cedc391e6c5
Convert only after namespaces are created. Convert mailboxes to INBOX
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
453 dest_namespaces, set); |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 if (ret == 0) { |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 /* 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
|
458 move as finished. */ |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
459 const char *src, *dest; |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
460 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
|
461 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5461
diff
changeset
|
462 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
|
463 &is_file); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
464 if (src != NULL) { |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
465 dest = t_strconcat(src, "-converted", NULL); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
466 if (rename(src, dest) < 0) { |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
467 i_error("Mailbox conversion: " |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
468 "rename(%s, %s) failed: %m", src, dest); |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
469 /* return success anyway */ |
9d7420b0e1ef
Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3983
diff
changeset
|
470 } |
3972
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 ret = 1; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 } |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 |
3973 | 475 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
|
476 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
|
477 return ret; |
a506ee4ec31e
Added "mail storage conversion" plugin. It can be used with IMAP, POP3
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 } |