annotate src/lib-storage/index/cydir/cydir-save.c @ 9658:8ba4253adc9b HEAD tip

*-login: SSL connections didn't get closed when the client got destroyed.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 May 2014 16:41:29 +0300
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8808
diff changeset
1 /* Copyright (c) 2007-2010 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;
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
30 struct mail *mail;
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
31 int fd;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 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
34 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
35 };
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 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
38 {
6160
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
39 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
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 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
42 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
43 create_count++,
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_usec), my_hostname);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 static const char *
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 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
49 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 const char *dir;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5458
diff changeset
52 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
53 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
54 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
55 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
56 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
58 struct mail_save_context *
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
59 cydir_save_alloc(struct mailbox_transaction_context *_t)
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 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
62 (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
63 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
64 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
65
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 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
67
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
68 if (t->save_ctx != NULL)
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
69 return &t->save_ctx->ctx;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
70
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
71 ctx = t->save_ctx = i_new(struct cydir_save_context, 1);
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
72 ctx->ctx.transaction = &t->ictx.mailbox_ctx;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
73 ctx->mbox = mbox;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
74 ctx->trans = t->ictx.trans;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
75 ctx->tmp_basename = cydir_generate_tmp_filename();
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
76 return &ctx->ctx;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
77 }
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
78
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
79 int cydir_save_begin(struct mail_save_context *_ctx, struct istream *input)
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
80 {
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
81 struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
82 struct mailbox_transaction_context *trans = _ctx->transaction;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
83 enum mail_flags save_flags;
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
84 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
85
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7189
diff changeset
86 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
87 const char *path;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
88
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
89 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
90 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
91 if (ctx->fd != -1) {
8808
a05a7a73b475 Maildir and Cydir: When saving mail, expose ostream to mail_save_context.output.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
92 _ctx->output =
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
93 o_stream_create_fd_file(ctx->fd, 0, FALSE);
8808
a05a7a73b475 Maildir and Cydir: When saving mail, expose ostream to mail_save_context.output.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
94 o_stream_cork(_ctx->output);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
95 } else {
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
96 mail_storage_set_critical(trans->box->storage,
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
97 "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
98 ctx->failed = TRUE;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
99 }
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7189
diff changeset
100 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6843
diff changeset
101 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
102 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 /* add to index */
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
105 save_flags = _ctx->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
106 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
107 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
108 save_flags);
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
109 if (_ctx->keywords != NULL) {
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 mail_index_update_keywords(ctx->trans, ctx->seq,
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
111 MODIFY_REPLACE, _ctx->keywords);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
114 if (_ctx->dest_mail == NULL) {
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (ctx->mail == NULL)
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
116 ctx->mail = mail_alloc(trans, 0, NULL);
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
117 _ctx->dest_mail = ctx->mail;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 }
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
119 mail_set_seq(_ctx->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
120
6528
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
121 crlf_input = i_stream_create_crlf(input);
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
122 ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input);
6528
aedda93baa2c Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents: 6430
diff changeset
123 i_stream_unref(&crlf_input);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 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
125 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 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
128 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 struct cydir_save_context *ctx = (struct cydir_save_context *)_ctx;
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5573
diff changeset
130 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
131
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 if (ctx->failed)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
5963
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
135 do {
8808
a05a7a73b475 Maildir and Cydir: When saving mail, expose ostream to mail_save_context.output.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
136 if (o_stream_send_istream(_ctx->output, ctx->input) < 0) {
5963
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
137 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
138 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
139 "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
140 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
141 }
9bef18690777 Cache updater might not have seen all the input data producing broken data.
Timo Sirainen <tss@iki.fi>
parents: 5629
diff changeset
142 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
143 return -1;
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
145 index_mail_cache_parse_continue(_ctx->dest_mail);
6083
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
146
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
147 /* 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
148 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
149 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
150 } 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
151 return 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 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
155 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 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
157 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
158 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
159 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
160
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 ctx->finished = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
8808
a05a7a73b475 Maildir and Cydir: When saving mail, expose ostream to mail_save_context.output.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
163 if (o_stream_flush(_ctx->output) < 0) {
6160
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
164 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
165 "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
166 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
167 }
fe1e6e895d8f Delay writing to output file when saving messages until output buffer is full.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
168
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
169 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
170 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
171 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
172 "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
173 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
174 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
175 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
176
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
177 if (_ctx->received_date == (time_t)-1) {
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
178 if (fstat(ctx->fd, &st) == 0)
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
179 _ctx->received_date = st.st_mtime;
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
180 else {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
181 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
182 "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
183 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
184 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
185 } else {
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
186 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
187
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
188 ut.actime = ioloop_time;
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
189 ut.modtime = _ctx->received_date;
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
190 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
191 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
192 "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
193 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
194 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
195 }
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6161
diff changeset
196
8808
a05a7a73b475 Maildir and Cydir: When saving mail, expose ostream to mail_save_context.output.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
197 o_stream_destroy(&_ctx->output);
5628
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
198 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
199 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
200 "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
201 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
202 }
950d7af6ed14 Don't leak memory and file descriptors in appends. fsync() unless it's
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
203 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
204
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 if (!ctx->failed)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 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
207 else {
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
208 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
209 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
210 "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
211 }
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
212 }
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
213
8075
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
214 index_mail_cache_parse_deinit(_ctx->dest_mail,
8a068f879cd1 mailbox_save_init() API was split to multiple functions.
Timo Sirainen <tss@iki.fi>
parents: 8038
diff changeset
215 _ctx->received_date, !ctx->failed);
5629
6b06a60d7e44 If saving is aborted, don't leave temporary files lying around. Update cache
Timo Sirainen <tss@iki.fi>
parents: 5628
diff changeset
216 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
217
8077
6d51328896d6 Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents: 8075
diff changeset
218 index_save_context_free(_ctx);
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 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
220 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 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
223 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 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
225
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 (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
228 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 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
231 {
5572
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5484
diff changeset
232 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
233 (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
234 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
235 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
236 const char *dir;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 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
238 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
239
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 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
241
6809
9d8c00d4c467 Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents: 6528
diff changeset
242 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
243 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 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
245 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 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
249 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
250 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
251
6267
3a1eed408cad mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
252 *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
253 *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
254 *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
255
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5458
diff changeset
256 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
257 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
258 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
259
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 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
261 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
262 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
263
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 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
265 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
266 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
267 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
268
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 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
270 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
271 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
272 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
273 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
274
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 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
276 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
277 "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
278 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
279 ctx->failed = TRUE;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 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
281 return -1;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
6843
9ca7f055b646 Free mail structure before transaction is committed, so that it can update
Timo Sirainen <tss@iki.fi>
parents: 6809
diff changeset
285 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
286 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
287 return 0;
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 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
291 {
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
292 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
293
5458
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 (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
295 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
296 }
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 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
299 {
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 if (!ctx->finished)
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 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
302
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 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
304 (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
305
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 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
307 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
308 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
309 i_free(ctx);
daca7ed634c0 Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 }