annotate src/lib-storage/index/cydir/cydir-save.c @ 6940:414c9d631a81 HEAD

Replaced t_push/t_pop calls with T_FRAME*() macros.
author Timo Sirainen <tss@iki.fi>
date Wed, 05 Dec 2007 17:47:44 +0200
parents 9ca7f055b646
children 7ed926ed7aa4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6430
47c3c4d41b26 Copyright cleanup: 2007-2007 -> 2007
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1 /* Copyright (c) 2007 Dovecot authors, see the included COPYING file */
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "hostpid.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
6528
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
6 #include "istream-crlf.h"
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "str.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "index-mail.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "cydir-storage.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "cydir-sync.h"
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdio.h>
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
14 #include <utime.h>
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct cydir_save_context {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct mail_save_context ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 struct cydir_mailbox *mbox;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct mail_index_transaction *trans;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 char *tmp_basename;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 unsigned int mail_count;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct cydir_sync_context *sync_ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 /* updated for each appended mail: */
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 uint32_t seq;
6083
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
29 struct istream *input;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 struct ostream *output;
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
31 struct mail *mail, *cur_dest_mail;
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
32 time_t cur_received_date;
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
33 int fd;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 unsigned int failed:1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 unsigned int finished:1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 };
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 static char *cydir_generate_tmp_filename(void)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 {
6160
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
41 static unsigned int create_count = 0;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
6160
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
43 return i_strdup_printf("temp.%s.P%sQ%uM%s.%s",
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 dec2str(ioloop_timeval.tv_sec), my_pid,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 create_count++,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 dec2str(ioloop_timeval.tv_usec), my_hostname);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 static const char *
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 cydir_get_save_path(struct cydir_save_context *ctx, unsigned int num)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 const char *dir;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5458
diff changeset
54 dir = mailbox_list_get_path(ctx->mbox->storage->storage.list,
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 ctx->mbox->ibox.box.name,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 MAILBOX_LIST_PATH_TYPE_MAILBOX);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 return t_strdup_printf("%s/%s.%u", dir, ctx->tmp_basename, num);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 int cydir_save_init(struct mailbox_transaction_context *_t,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 enum mail_flags flags, struct mail_keywords *keywords,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6393
diff changeset
62 time_t received_date, int timezone_offset ATTR_UNUSED,
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6393
diff changeset
63 const char *from_envelope ATTR_UNUSED,
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 struct istream *input, struct mail *dest_mail,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 struct mail_save_context **ctx_r)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 struct cydir_transaction_context *t =
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 (struct cydir_transaction_context *)_t;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 struct cydir_mailbox *mbox = (struct cydir_mailbox *)t->ictx.ibox;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 struct cydir_save_context *ctx = t->save_ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 enum mail_flags save_flags;
6528
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
72 struct istream *crlf_input;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 i_assert((t->ictx.flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (ctx == NULL) {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 ctx = t->save_ctx = i_new(struct cydir_save_context, 1);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 ctx->ctx.transaction = &t->ictx.mailbox_ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 ctx->mbox = mbox;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 ctx->trans = t->ictx.trans;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 ctx->tmp_basename = cydir_generate_tmp_filename();
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
84 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
85 const char *path;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
86
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
87 path = cydir_get_save_path(ctx, ctx->mail_count);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
88 ctx->fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0660);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
89 if (ctx->fd != -1) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
90 ctx->output =
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
91 o_stream_create_fd_file(ctx->fd, 0, FALSE);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
92 o_stream_cork(ctx->output);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
93 } else {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
94 mail_storage_set_critical(_t->box->storage,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
95 "open(%s) failed: %m", path);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
96 ctx->failed = TRUE;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
97 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
98 );
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
99 if (ctx->failed)
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 /* add to index */
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 5963
diff changeset
103 save_flags = flags & ~MAIL_RECENT;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 mail_index_append(ctx->trans, 0, &ctx->seq);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 save_flags);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 if (keywords != NULL) {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 mail_index_update_keywords(ctx->trans, ctx->seq,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 MODIFY_REPLACE, keywords);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 if (dest_mail == NULL) {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 if (ctx->mail == NULL)
6302
a8d5d826318b Call mail_alloc/mail_free, not index_mail_alloc/index_mail/free directly.
Timo Sirainen <tss@iki.fi>
parents: 6277
diff changeset
114 ctx->mail = mail_alloc(_t, 0, NULL);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 dest_mail = ctx->mail;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
6277
5f66277bbe40 mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents: 6267
diff changeset
117 mail_set_seq(dest_mail, ctx->seq);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
6528
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
119 crlf_input = i_stream_create_crlf(input);
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
120 ctx->input = index_mail_cache_parse_init(dest_mail, crlf_input);
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
121 i_stream_unref(&crlf_input);
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
122
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
123 ctx->cur_dest_mail = dest_mail;
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
124 ctx->cur_received_date = received_date;
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
125
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 *ctx_r = &ctx->ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 return ctx->failed ? -1 : 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 int cydir_save_continue(struct mail_save_context *_ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5573
diff changeset
133 struct mail_storage *storage = &ctx->mbox->storage->storage;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 if (ctx->failed)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137
5963
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
138 do {
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
139 if (o_stream_send_istream(ctx->output, ctx->input) < 0) {
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
140 if (!mail_storage_set_error_from_errno(storage)) {
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
141 mail_storage_set_critical(storage,
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
142 "o_stream_send_istream(%s) failed: %m",
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
143 cydir_get_save_path(ctx, ctx->mail_count));
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
144 }
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
145 ctx->failed = TRUE;
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
146 return -1;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
6083
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
148 index_mail_cache_parse_continue(ctx->cur_dest_mail);
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
149
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
150 /* both tee input readers may consume data from our primary
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
151 input stream. we'll have to make sure we don't return with
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
152 one of the streams still having data in them. */
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
153 } while (i_stream_read(ctx->input) > 0);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 return 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 int cydir_save_finish(struct mail_save_context *_ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
160 struct mail_storage *storage = &ctx->mbox->storage->storage;
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
161 const char *path = cydir_get_save_path(ctx, ctx->mail_count);
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
162 struct stat st;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 ctx->finished = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165
6160
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
166 if (o_stream_flush(ctx->output) < 0) {
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
167 mail_storage_set_critical(storage,
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
168 "o_stream_flush(%s) failed: %m", path);
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
169 ctx->failed = TRUE;
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
170 }
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
171
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
172 if (!ctx->mbox->ibox.fsync_disable) {
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
173 if (fsync(ctx->fd) < 0) {
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
174 mail_storage_set_critical(storage,
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
175 "fsync(%s) failed: %m", path);
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
176 ctx->failed = TRUE;
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
177 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
178 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
179
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
180 if (ctx->cur_received_date == (time_t)-1) {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
181 if (fstat(ctx->fd, &st) == 0)
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
182 ctx->cur_received_date = st.st_mtime;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
183 else {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
184 mail_storage_set_critical(storage,
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
185 "fstat(%s) failed: %m", path);
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
186 ctx->failed = TRUE;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
187 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
188 } else {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
189 struct utimbuf ut;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
190
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
191 ut.actime = ioloop_time;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
192 ut.modtime = ctx->cur_received_date;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
193 if (utime(path, &ut) < 0) {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
194 mail_storage_set_critical(storage,
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
195 "utime(%s) failed: %m", path);
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
196 ctx->failed = TRUE;
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
197 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
198 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
199
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
200 o_stream_destroy(&ctx->output);
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
201 if (close(ctx->fd) < 0) {
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
202 mail_storage_set_critical(storage,
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
203 "close(%s) failed: %m", path);
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
204 ctx->failed = TRUE;
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
205 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
206 ctx->fd = -1;
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
207
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 if (!ctx->failed)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 ctx->mail_count++;
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
210 else {
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
211 if (unlink(path) < 0) {
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
212 mail_storage_set_critical(storage,
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
213 "unlink(%s) failed: %m", path);
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
214 }
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
215 }
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
216
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
217 index_mail_cache_parse_deinit(ctx->cur_dest_mail,
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
218 ctx->cur_received_date);
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
219 i_stream_unref(&ctx->input);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 return ctx->failed ? -1 : 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 void cydir_save_cancel(struct mail_save_context *_ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 (void)cydir_save_finish(_ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 {
5572
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5484
diff changeset
234 struct cydir_transaction_context *t =
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5484
diff changeset
235 (struct cydir_transaction_context *)ctx->ctx.transaction;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 const struct mail_index_header *hdr;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 uint32_t i, uid, next_uid;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 const char *dir;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 string_t *src_path, *dest_path;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 unsigned int src_prefixlen, dest_prefixlen;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 i_assert(ctx->finished);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
6809
9d8c00d4c467 Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents: 6528
diff changeset
244 if (cydir_sync_begin(ctx->mbox, &ctx->sync_ctx, TRUE) < 0) {
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 cydir_transaction_save_rollback(ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 hdr = mail_index_get_header(ctx->sync_ctx->sync_view);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 uid = hdr->next_uid;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 mail_index_append_assign_uids(ctx->trans, uid, &next_uid);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253
6267
3a1eed408cad mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
254 *t->ictx.saved_uid_validity = ctx->sync_ctx->uid_validity;
5573
9805becea644 Fixed mailbox_transaction_commit_get_uids() to actually work and not just
Timo Sirainen <tss@iki.fi>
parents: 5572
diff changeset
255 *t->ictx.first_saved_uid = uid;
9805becea644 Fixed mailbox_transaction_commit_get_uids() to actually work and not just
Timo Sirainen <tss@iki.fi>
parents: 5572
diff changeset
256 *t->ictx.last_saved_uid = next_uid - 1;
5572
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5484
diff changeset
257
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5458
diff changeset
258 dir = mailbox_list_get_path(ctx->mbox->storage->storage.list,
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 ctx->mbox->ibox.box.name,
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 MAILBOX_LIST_PATH_TYPE_MAILBOX);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 src_path = t_str_new(256);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 str_printfa(src_path, "%s/%s.", dir, ctx->tmp_basename);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 src_prefixlen = str_len(src_path);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 dest_path = t_str_new(256);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 str_append(dest_path, dir);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 str_append_c(dest_path, '/');
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 dest_prefixlen = str_len(dest_path);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 for (i = 0; i < ctx->mail_count; i++, uid++) {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 str_truncate(src_path, src_prefixlen);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 str_truncate(dest_path, dest_prefixlen);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 str_printfa(src_path, "%u", i);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 str_printfa(dest_path, "%u.", uid);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 if (rename(str_c(src_path), str_c(dest_path)) < 0) {
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5458
diff changeset
278 mail_storage_set_critical(&ctx->mbox->storage->storage,
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 "rename(%s, %s) failed: %m",
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 str_c(src_path), str_c(dest_path));
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 cydir_transaction_save_rollback(ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
6843
9ca7f055b646 Free mail structure before transaction is committed, so that it can update
Timo Sirainen <tss@iki.fi>
parents: 6809
diff changeset
287 if (ctx->mail != NULL)
9ca7f055b646 Free mail structure before transaction is committed, so that it can update
Timo Sirainen <tss@iki.fi>
parents: 6809
diff changeset
288 mail_free(&ctx->mail);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 return 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 void cydir_transaction_save_commit_post(struct cydir_save_context *ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 {
6393
777fede4d899 set save_ctx.transaction=NULL so we don't accidentally try to use it.
Timo Sirainen <tss@iki.fi>
parents: 6302
diff changeset
294 ctx->ctx.transaction = NULL; /* transaction is already freed */
777fede4d899 set save_ctx.transaction=NULL so we don't accidentally try to use it.
Timo Sirainen <tss@iki.fi>
parents: 6302
diff changeset
295
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 (void)cydir_sync_finish(&ctx->sync_ctx, TRUE);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 cydir_transaction_save_rollback(ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 void cydir_transaction_save_rollback(struct cydir_save_context *ctx)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 if (!ctx->finished)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 cydir_save_cancel(&ctx->ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 if (ctx->sync_ctx != NULL)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 (void)cydir_sync_finish(&ctx->sync_ctx, FALSE);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 if (ctx->mail != NULL)
6302
a8d5d826318b Call mail_alloc/mail_free, not index_mail_alloc/index_mail/free directly.
Timo Sirainen <tss@iki.fi>
parents: 6277
diff changeset
309 mail_free(&ctx->mail);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 i_free(ctx->tmp_basename);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 i_free(ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }