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