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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
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
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
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
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
372 int ret = 0;
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
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
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
384 TRUE) < 0) {
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
385 ret = -1;
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
386 break;
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
387 }
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
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
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
390 ret = -1;
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
391 return ret;
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
392 }
858ca16c704b Convert subscriptions also.
Timo Sirainen <tss@iki.fi>
parents: 4321
diff changeset
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
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
439 /* just in case if another process just had converted the mailbox,
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
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
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
444 /* No need for conversion anymore. */
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
445 file_dotlock_delete(&dotlock);
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
446 return 0;
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
447 }
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
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
fec2e36ddb3b And a few fixes
Timo Sirainen <tss@iki.fi>
parents: 3972
diff changeset
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 }