annotate src/lib-storage/index/dbox-common/dbox-sync-rebuild.c @ 14682:d0d7b810646b

Make sure we check all the functions' return values. Minor API changes to simplify this. Checked using a patched clang that adds attribute(warn_unused_result) to all functions. This commit fixes several error handling mistakes.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jun 2012 01:14:03 +0300
parents c93ca5e46a8a
children 89c319980584
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 14084
diff changeset
1 /* Copyright (c) 2007-2012 Dovecot authors, see the included COPYING file */
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
14084
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
5 #include "mail-cache.h"
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
6 #include "mail-index-modseq.h"
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
7 #include "mailbox-list-private.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "index-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "dbox-sync-rebuild.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 static void
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 dbox_sync_index_copy_cache(struct dbox_sync_rebuild_context *ctx,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 struct mail_index_view *view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 uint32_t old_seq, uint32_t new_seq)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct mail_index_map *map;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 const void *data;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 uint32_t reset_id;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 bool expunged;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 if (ctx->cache_ext_id == (uint32_t)-1)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 return;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 mail_index_lookup_ext_full(view, old_seq, ctx->cache_ext_id,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 &map, &data, &expunged);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 if (expunged)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 return;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 if (!mail_index_ext_get_reset_id(view, map, ctx->cache_ext_id,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 &reset_id) || reset_id == 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 return;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 if (!ctx->cache_used) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 /* set reset id */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 ctx->cache_used = TRUE;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 ctx->cache_reset_id = reset_id;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 mail_index_ext_reset(ctx->trans, ctx->cache_ext_id,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 ctx->cache_reset_id, TRUE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 if (ctx->cache_reset_id == reset_id) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 mail_index_update_ext(ctx->trans, new_seq,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 ctx->cache_ext_id, data, NULL);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 static void
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 dbox_sync_index_copy_from_old(struct dbox_sync_rebuild_context *ctx,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct mail_index_view *view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 uint32_t old_seq, uint32_t new_seq)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 struct mail_index *index = mail_index_view_get_index(view);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 const struct mail_index_record *rec;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 ARRAY_TYPE(keyword_indexes) old_keywords;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 struct mail_keywords *kw;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
56 uint64_t modseq;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 /* copy flags */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 rec = mail_index_lookup(view, old_seq);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 mail_index_update_flags(ctx->trans, new_seq,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 MODIFY_REPLACE, rec->flags);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 /* copy keywords */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 t_array_init(&old_keywords, 32);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 mail_index_lookup_keywords(view, old_seq, &old_keywords);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 kw = mail_index_keywords_create_from_indexes(index, &old_keywords);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 mail_index_update_keywords(ctx->trans, new_seq, MODIFY_REPLACE, kw);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 mail_index_keywords_unref(&kw);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
70 /* copy modseq */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
71 modseq = mail_index_modseq_lookup(view, old_seq);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
72 mail_index_update_modseq(ctx->trans, new_seq, modseq);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
73
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 dbox_sync_index_copy_cache(ctx, view, old_seq, new_seq);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 void dbox_sync_rebuild_index_metadata(struct dbox_sync_rebuild_context *ctx,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 uint32_t new_seq, uint32_t uid)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 uint32_t old_seq;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 if (mail_index_lookup_seq(ctx->view, uid, &old_seq)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 /* the message exists in the old index.
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 copy the metadata from it. */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 dbox_sync_index_copy_from_old(ctx, ctx->view, old_seq, new_seq);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 } else if (ctx->backup_view != NULL &&
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 mail_index_lookup_seq(ctx->backup_view, uid, &old_seq)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 /* copy the metadata from backup index. */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 dbox_sync_index_copy_from_old(ctx, ctx->backup_view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 old_seq, new_seq);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
94 static void dbox_sync_rebuild_header(struct dbox_sync_rebuild_context *ctx)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
95 {
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
96 const struct mail_index_header *hdr, *backup_hdr, *trans_hdr;
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
97 struct mail_index *index = mail_index_view_get_index(ctx->view);
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
98 struct mail_index_modseq_header modseq_hdr;
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
99 struct mail_index_view *trans_view;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
100 uint32_t uid_validity, next_uid;
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
101 uint64_t modseq;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
102
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
103 hdr = mail_index_get_header(ctx->view);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
104 backup_hdr = ctx->backup_view == NULL ? NULL :
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
105 mail_index_get_header(ctx->backup_view);
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
106 trans_view = mail_index_transaction_open_updated_view(ctx->trans);
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
107 trans_hdr = mail_index_get_header(trans_view);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
108
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
109 /* set uidvalidity */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
110 if (hdr->uid_validity != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
111 uid_validity = hdr->uid_validity;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
112 else if (backup_hdr != NULL && backup_hdr->uid_validity != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
113 uid_validity = backup_hdr->uid_validity;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
114 else
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
115 uid_validity = dbox_get_uidvalidity_next(ctx->box->list);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
116 mail_index_update_header(ctx->trans,
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
117 offsetof(struct mail_index_header, uid_validity),
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
118 &uid_validity, sizeof(uid_validity), TRUE);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
119
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
120 /* set next-uid */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
121 if (hdr->next_uid != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
122 next_uid = hdr->next_uid;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
123 else if (backup_hdr != NULL && backup_hdr->next_uid != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
124 next_uid = backup_hdr->next_uid;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
125 else
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
126 next_uid = dbox_get_uidvalidity_next(ctx->box->list);
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
127 if (next_uid > trans_hdr->next_uid) {
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
128 mail_index_update_header(ctx->trans,
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
129 offsetof(struct mail_index_header, next_uid),
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
130 &next_uid, sizeof(next_uid), FALSE);
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
131 }
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
132
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
133 /* set highest-modseq */
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
134 memset(&modseq_hdr, 0, sizeof(modseq_hdr));
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
135 modseq_hdr.highest_modseq = mail_index_modseq_get_highest(ctx->view);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
136 if (ctx->backup_view != NULL) {
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
137 modseq = mail_index_modseq_get_highest(ctx->backup_view);
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
138 if (modseq_hdr.highest_modseq < modseq)
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
139 modseq_hdr.highest_modseq = modseq;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
140 }
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
141 mail_index_update_header_ext(ctx->trans, index->modseq_ext_id,
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
142 0, &modseq_hdr, sizeof(modseq_hdr));
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
143 mail_index_view_close(&trans_view);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
144 }
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
145
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 struct dbox_sync_rebuild_context *
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
147 dbox_sync_index_rebuild_init(struct mailbox *box,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 struct mail_index_view *view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 struct mail_index_transaction *trans)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 struct dbox_sync_rebuild_context *ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 const char *index_dir;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 enum mail_index_open_flags open_flags = MAIL_INDEX_OPEN_FLAG_READONLY;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 ctx = i_new(struct dbox_sync_rebuild_context, 1);
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
156 ctx->box = box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 ctx->view = view;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 ctx->trans = trans;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 mail_index_reset(ctx->trans);
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
160 index_mailbox_reset_uidvalidity(box);
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
161 (void)mail_index_ext_lookup(box->index, "cache", &ctx->cache_ext_id);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
14084
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
163 /* open cache and read the caching decisions. we'll reset the cache in
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
164 case it contains any invalid data, but we want to preserve the
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
165 decisions. */
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
166 (void)mail_cache_open_and_verify(ctx->box->cache);
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
167 mail_cache_reset(box->cache);
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
168
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 /* if backup index file exists, try to use it */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 index_dir = mailbox_list_get_path(box->list, box->name,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 MAILBOX_LIST_PATH_TYPE_INDEX);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 ctx->backup_index =
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 mail_index_alloc(index_dir, DBOX_INDEX_PREFIX".backup");
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 #ifndef MMAP_CONFLICTS_WRITE
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (box->storage->set->mmap_disable)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 #endif
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 open_flags |= MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE;
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
179 mail_index_set_lock_method(ctx->backup_index,
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
180 box->storage->set->parsed_lock_method, -1U);
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
181 if (mail_index_open(ctx->backup_index, open_flags) <= 0)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 mail_index_free(&ctx->backup_index);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 else
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 ctx->backup_view = mail_index_view_open(ctx->backup_index);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 return ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 void dbox_sync_index_rebuild_deinit(struct dbox_sync_rebuild_context **_ctx)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 struct dbox_sync_rebuild_context *ctx = *_ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 *_ctx = NULL;
14084
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
193
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
194 /* initialize cache file with the old field decisions */
d8d214cc1936 dbox: Index rebuild now preserves caching decisions.
Timo Sirainen <tss@iki.fi>
parents: 14037
diff changeset
195 (void)mail_cache_compress(ctx->box->cache, ctx->trans);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
196 dbox_sync_rebuild_header(ctx);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 if (ctx->backup_index != NULL) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 mail_index_view_close(&ctx->backup_view);
10677
93fe3aa23bdb lib-index: Don't close index files if they're still being used by another mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
199 mail_index_close(ctx->backup_index);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 mail_index_free(&ctx->backup_index);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
204
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
205 int dbox_sync_rebuild_verify_alt_storage(struct mailbox_list *list)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
206 {
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
207 const char *alt_path, *error;
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
208 struct stat st;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
209
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
210 alt_path = mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_ALT_DIR);
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
211 if (alt_path == NULL)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
212 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
213
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
214 /* make sure alt storage is mounted. if it's not, abort the rebuild. */
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
215 if (stat(alt_path, &st) == 0)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
216 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
217 if (errno != ENOENT) {
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
218 i_error("stat(%s) failed: %m", alt_path);
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
219 return -1;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
220 }
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
221
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
222 /* try to create the alt directory. if it fails, it means alt
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
223 storage isn't mounted. */
13091
c4bac1e48611 lib-storage: mkdir APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
224 if (mailbox_list_mkdir_root(list, alt_path,
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
225 MAILBOX_LIST_PATH_TYPE_ALT_DIR,
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
226 &error) < 0) {
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
227 i_error("Couldn't create dbox alt root dir %s: %s",
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
228 alt_path, error);
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
229 return -1;
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
230 }
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
231 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
232 }