Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 } |