annotate src/plugins/convert/convert-storage.c @ 5535:7aa36ab24c3b HEAD

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