annotate src/lib-storage/index/dbox-single/sdbox-file.c @ 21198:bb081fa224e0

sdbox: Don't log an error if stub is added twice There's no locking for them, so it's fine if two processes add the same mail. The second one could be ignored, but it was a bit easier to just let it rename over the first one.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 23 Nov 2016 13:25:54 +0200
parents 0fd0fb05e2b3
children 2e2563132d5f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19552
0f22db71df7a global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19136
diff changeset
1 /* Copyright (c) 2007-2016 Dovecot authors, see the included COPYING file */
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "eacces-error.h"
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
5 #include "fdatasync-path.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mkdir-parents.h"
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
7 #include "istream.h"
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
8 #include "ostream.h"
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
9 #include "str.h"
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
10 #include "fs-api.h"
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
11 #include "dbox-attachment.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "sdbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "sdbox-file.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <stdio.h>
14009
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
16 #include <utime.h>
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 static void sdbox_file_init_paths(struct sdbox_file *file, const char *fname)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
10710
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
20 struct mailbox *box = &file->mbox->box;
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
21 const char *alt_path;
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
22
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 i_free(file->file.primary_path);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 i_free(file->file.alt_path);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 file->file.primary_path =
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
26 i_strdup_printf("%s/%s", mailbox_get_path(box), fname);
19697
204d695073de sdbox: Failing after saved mails' UIDs were already assigned caused unlink()ing garbage
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
27 file->file.cur_path = file->file.primary_path;
10710
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
28
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15100
diff changeset
29 if (mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX,
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15100
diff changeset
30 &alt_path) > 0)
10710
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
31 file->file.alt_path = i_strdup_printf("%s/%s", alt_path, fname);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct dbox_file *sdbox_file_init(struct sdbox_mailbox *mbox, uint32_t uid)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct sdbox_file *file;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 const char *fname;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 file = i_new(struct sdbox_file, 1);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 file->file.storage = &mbox->storage->storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 file->mbox = mbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 T_BEGIN {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 if (uid != 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 sdbox_file_init_paths(file, fname);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 file->uid = uid;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 } else {
18694
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
48 sdbox_file_init_paths(file, dbox_generate_tmp_filename());
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 } T_END;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 dbox_file_init(&file->file);
10965
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
52 return &file->file;
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
53 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
10965
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
55 struct dbox_file *sdbox_file_create(struct sdbox_mailbox *mbox)
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
56 {
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
57 struct dbox_file *file;
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
58
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
59 file = sdbox_file_init(mbox, 0);
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
60 file->fd = file->storage->v.
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
61 file_create_fd(file, file->primary_path, FALSE);
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
62 return file;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
65 void sdbox_file_free(struct dbox_file *file)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
66 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
67 struct sdbox_file *sfile = (struct sdbox_file *)file;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
68
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
69 if (sfile->attachment_pool != NULL)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
70 pool_unref(&sfile->attachment_pool);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
71 dbox_file_free(file);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
72 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
73
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
74 int sdbox_file_get_attachments(struct dbox_file *file, const char **extrefs_r)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
75 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
76 const char *line;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
77 bool deleted;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
78 int ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
79
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
80 *extrefs_r = NULL;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
81
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
82 /* read the metadata */
12332
9e400f6963eb dbox: Reverted the "check if altpath is mounted" change for now.
Timo Sirainen <tss@iki.fi>
parents: 12327
diff changeset
83 ret = dbox_file_open(file, &deleted);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
84 if (ret > 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
85 if (deleted)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
86 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
87 if ((ret = dbox_file_seek(file, 0)) > 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
88 ret = dbox_file_metadata_read(file);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
89 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
90 if (ret <= 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
91 if (ret < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
92 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
93 /* corrupted file. we're deleting it anyway. */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
94 line = NULL;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
95 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
96 line = dbox_file_metadata_get(file, DBOX_METADATA_EXT_REF);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
97 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
98 if (line == NULL) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
99 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
100 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
101 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
102 *extrefs_r = line;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
103 return 1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
104 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
105
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
106 const char *
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
107 sdbox_file_attachment_relpath(struct sdbox_file *file, const char *srcpath)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
108 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
109 const char *p;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
110
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
111 p = strchr(srcpath, '-');
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
112 if (p == NULL) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
113 mail_storage_set_critical(file->mbox->box.storage,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
114 "sdbox attachment path in invalid format: %s", srcpath);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
115 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
116 p = strchr(p+1, '-');
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
117 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
118 return t_strdup_printf("%s-%s-%u",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
119 p == NULL ? srcpath : t_strdup_until(srcpath, p),
13287
957060ca5b69 Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
120 guid_128_to_string(file->mbox->mailbox_guid),
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
121 file->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
122 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
123
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
124 static int sdbox_file_rename_attachments(struct sdbox_file *file)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
125 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
126 struct dbox_storage *storage = file->file.storage;
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
127 struct fs_file *src_file, *dest_file;
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
128 const char *const *pathp, *src, *dest;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
129 int ret = 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
130
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
131 array_foreach(&file->attachment_paths, pathp) T_BEGIN {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
132 src = t_strdup_printf("%s/%s", storage->attachment_dir, *pathp);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
133 dest = t_strdup_printf("%s/%s", storage->attachment_dir,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
134 sdbox_file_attachment_relpath(file, *pathp));
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
135 src_file = fs_file_init(storage->attachment_fs, src,
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
136 FS_OPEN_MODE_READONLY);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
137 dest_file = fs_file_init(storage->attachment_fs, dest,
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
138 FS_OPEN_MODE_READONLY);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
139 if (fs_rename(src_file, dest_file) < 0) {
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
140 mail_storage_set_critical(&storage->storage, "%s",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
141 fs_last_error(storage->attachment_fs));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
142 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
143 }
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
144 fs_file_deinit(&src_file);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
145 fs_file_deinit(&dest_file);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
146 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
147 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
148 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
149
21198
bb081fa224e0 sdbox: Don't log an error if stub is added twice
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20264
diff changeset
150 int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid,
bb081fa224e0 sdbox: Don't log an error if stub is added twice
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20264
diff changeset
151 bool ignore_if_exists)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 {
18694
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
153 const char *p, *old_path, *dir, *new_fname, *new_path;
14082
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
154 struct stat st;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 i_assert(file->uid == 0);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 i_assert(uid != 0);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 old_path = file->file.cur_path;
18694
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
160 p = strrchr(old_path, '/');
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
161 i_assert(p != NULL);
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
162 dir = t_strdup_until(old_path, p);
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
163
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 new_fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
18694
9ad3f11617f1 sdbox: When hardlink-copying a mail in alt storage, keep it within the alt storage.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
165 new_path = t_strdup_printf("%s/%s", dir, new_fname);
14082
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
166
21198
bb081fa224e0 sdbox: Don't log an error if stub is added twice
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20264
diff changeset
167 if (!ignore_if_exists && stat(new_path, &st) == 0) {
14082
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
168 mail_storage_set_critical(&file->file.storage->storage,
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
169 "sdbox: %s already exists, rebuilding index", new_path);
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
170 sdbox_set_mailbox_corrupted(&file->mbox->box);
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
171 return -1;
09db0f7aa6ce dbox: Never rename() mail files over existing files. If such a file exists, rebuild indexes.
Timo Sirainen <tss@iki.fi>
parents: 14009
diff changeset
172 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 if (rename(old_path, new_path) < 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 mail_storage_set_critical(&file->file.storage->storage,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 "rename(%s, %s) failed: %m",
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 old_path, new_path);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 sdbox_file_init_paths(file, new_fname);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 file->uid = uid;
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
181
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
182 if (array_is_created(&file->attachment_paths)) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
183 if (sdbox_file_rename_attachments(file) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
184 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
185 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
189 static int sdbox_file_unlink_aborted_save_attachments(struct sdbox_file *file)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
190 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
191 struct dbox_storage *storage = file->file.storage;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
192 struct fs *fs = storage->attachment_fs;
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
193 struct fs_file *fs_file;
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
194 const char *const *pathp, *path;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
195 int ret = 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
196
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
197 array_foreach(&file->attachment_paths, pathp) T_BEGIN {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
198 /* we don't know if we aborted before renaming this attachment,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
199 so try deleting both source and dest path. the source paths
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
200 point to temporary files (not to source messages'
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
201 attachment paths), so it's safe to delete them. */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
202 path = t_strdup_printf("%s/%s", storage->attachment_dir,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
203 *pathp);
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
204 fs_file = fs_file_init(fs, path, FS_OPEN_MODE_READONLY);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
205 if (fs_delete(fs_file) < 0 &&
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
206 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
207 mail_storage_set_critical(&storage->storage, "%s",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
208 fs_last_error(fs));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
209 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
210 }
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
211 fs_file_deinit(&fs_file);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
212
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
213 path = t_strdup_printf("%s/%s", storage->attachment_dir,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
214 sdbox_file_attachment_relpath(file, *pathp));
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
215 fs_file = fs_file_init(fs, path, FS_OPEN_MODE_READONLY);
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
216 if (fs_delete(fs_file) < 0 &&
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
217 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
218 mail_storage_set_critical(&storage->storage, "%s",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
219 fs_last_error(fs));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
220 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
221 }
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15163
diff changeset
222 fs_file_deinit(&fs_file);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
223 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
224 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
225 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
226
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
227 int sdbox_file_unlink_aborted_save(struct sdbox_file *file)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
228 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
229 int ret = 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
230
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
231 if (unlink(file->file.cur_path) < 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
232 mail_storage_set_critical(file->mbox->box.storage,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
233 "unlink(%s) failed: %m", file->file.cur_path);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
234 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
235 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
236 if (array_is_created(&file->attachment_paths)) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
237 if (sdbox_file_unlink_aborted_save_attachments(file) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
238 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
239 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
240 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
241 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
242
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 int sdbox_file_create_fd(struct dbox_file *file, const char *path, bool parents)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 struct sdbox_file *sfile = (struct sdbox_file *)file;
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
246 struct mailbox *box = &sfile->mbox->box;
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
247 const struct mailbox_permissions *perm = mailbox_get_permissions(box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 const char *p, *dir;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 mode_t old_mask;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 int fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
252 old_mask = umask(0666 & ~perm->file_create_mode);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 if (fd == -1 && errno == ENOENT && parents &&
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 (p = strrchr(path, '/')) != NULL) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 dir = t_strdup_until(path, p);
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
258 if (mkdir_parents_chgrp(dir, perm->dir_create_mode,
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
259 perm->file_create_gid,
17896
3e9fda96a205 sdbox: Fixed race condition when two processes mkdir() the same directory
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
260 perm->file_create_gid_origin) < 0 &&
3e9fda96a205 sdbox: Fixed race condition when two processes mkdir() the same directory
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
261 errno != EEXIST) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 mail_storage_set_critical(box->storage,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 "mkdir_parents(%s) failed: %m", dir);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 /* try again */
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
267 old_mask = umask(0666 & ~perm->file_create_mode);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 if (fd == -1) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 mail_storage_set_critical(box->storage,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 "open(%s, O_CREAT) failed: %m", path);
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
274 } else if (perm->file_create_gid == (gid_t)-1) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 /* no group change */
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
276 } else if (fchown(fd, (uid_t)-1, perm->file_create_gid) < 0) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 if (errno == EPERM) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 mail_storage_set_critical(box->storage, "%s",
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 eperm_error_get_chgrp("fchown", path,
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
280 perm->file_create_gid,
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
281 perm->file_create_gid_origin));
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 mail_storage_set_critical(box->storage,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 "fchown(%s, -1, %ld) failed: %m",
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
285 path, (long)perm->file_create_gid);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 /* continue anyway */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 return fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 }
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
291
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
292 int sdbox_file_move(struct dbox_file *file, bool alt_path)
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
293 {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
294 struct mail_storage *storage = &file->storage->storage;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
295 struct ostream *output;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
296 const char *dest_dir, *temp_path, *dest_path, *p;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
297 struct stat st;
14009
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
298 struct utimbuf ut;
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
299 bool deleted;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
300 int out_fd, ret = 0;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
301
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
302 i_assert(file->input != NULL);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
303
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
304 if (dbox_file_is_in_alt(file) == alt_path)
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
305 return 0;
20204
932a63ff512e sdbox: Make sure we don't crash when altmove-flag is set but alt path is missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19697
diff changeset
306 if (file->alt_path == NULL)
932a63ff512e sdbox: Make sure we don't crash when altmove-flag is set but alt path is missing.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19697
diff changeset
307 return 0;
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
308
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
309 if (stat(file->cur_path, &st) < 0 && errno == ENOENT) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
310 /* already expunged/moved by another session */
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
311 return 0;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
312 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
313
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
314 dest_path = !alt_path ? file->primary_path : file->alt_path;
20215
389c5094c2a8 lib-dcrypt: Initial implementation
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20204
diff changeset
315
389c5094c2a8 lib-dcrypt: Initial implementation
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20204
diff changeset
316 i_assert(dest_path != NULL);
389c5094c2a8 lib-dcrypt: Initial implementation
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20204
diff changeset
317
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
318 p = strrchr(dest_path, '/');
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
319 i_assert(p != NULL);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
320 dest_dir = t_strdup_until(dest_path, p);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
321 temp_path = t_strdup_printf("%s/%s", dest_dir,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
322 dbox_generate_tmp_filename());
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
323
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
324 /* first copy the file. make sure to catch every possible error
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
325 since we really don't want to break the file. */
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
326 out_fd = file->storage->v.file_create_fd(file, temp_path, TRUE);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
327 if (out_fd == -1)
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
328 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
329
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
330 output = o_stream_create_fd_file(out_fd, 0, FALSE);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
331 i_stream_seek(file->input, 0);
20264
0fd0fb05e2b3 global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20215
diff changeset
332 ret = o_stream_send_istream(output, file->input) > 0 ? 0 : -1;
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14356
diff changeset
333 if (o_stream_nfinish(output) < 0) {
20264
0fd0fb05e2b3 global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20215
diff changeset
334 mail_storage_set_critical(storage, "write(%s) failed: %s",
0fd0fb05e2b3 global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20215
diff changeset
335 temp_path, o_stream_get_error(output));
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
336 ret = -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
337 } else if (file->input->stream_errno != 0) {
20264
0fd0fb05e2b3 global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20215
diff changeset
338 mail_storage_set_critical(storage, "read(%s) failed: %s",
0fd0fb05e2b3 global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20215
diff changeset
339 temp_path, i_stream_get_error(file->input));
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
340 ret = -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
341 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
342 o_stream_unref(&output);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
343
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
344 if (storage->set->parsed_fsync_mode != FSYNC_MODE_NEVER && ret == 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
345 if (fsync(out_fd) < 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
346 mail_storage_set_critical(storage,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
347 "fsync(%s) failed: %m", temp_path);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
348 ret = -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
349 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
350 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
351 if (close(out_fd) < 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
352 mail_storage_set_critical(storage,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
353 "close(%s) failed: %m", temp_path);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
354 ret = -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
355 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
356 if (ret < 0) {
19136
fefaa6d09a81 Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 18694
diff changeset
357 i_unlink(temp_path);
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
358 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
359 }
14009
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
360 /* preserve the original atime/mtime. this isn't necessary for Dovecot,
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
361 but could be useful for external reasons. */
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
362 ut.actime = st.st_atime;
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
363 ut.modtime = st.st_mtime;
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
364 if (utime(temp_path, &ut) < 0) {
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
365 mail_storage_set_critical(storage,
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
366 "utime(%s) failed: %m", temp_path);
10320252b521 sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents: 13287
diff changeset
367 }
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
368
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
369 /* the temp file was successfully written. rename it now to the
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
370 destination file. the destination shouldn't exist, but if it does
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
371 its contents should be the same (except for maybe older metadata) */
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
372 if (rename(temp_path, dest_path) < 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
373 mail_storage_set_critical(storage,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
374 "rename(%s, %s) failed: %m", temp_path, dest_path);
19136
fefaa6d09a81 Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 18694
diff changeset
375 i_unlink_if_exists(temp_path);
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
376 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
377 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
378 if (storage->set->parsed_fsync_mode != FSYNC_MODE_NEVER) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
379 if (fdatasync_path(dest_dir) < 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
380 mail_storage_set_critical(storage,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
381 "fdatasync(%s) failed: %m", dest_dir);
19136
fefaa6d09a81 Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 18694
diff changeset
382 i_unlink(dest_path);
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
383 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
384 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
385 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
386 if (unlink(file->cur_path) < 0) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
387 dbox_file_set_syscall_error(file, "unlink()");
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
388 if (errno == EACCES) {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
389 /* configuration problem? revert the write */
19136
fefaa6d09a81 Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 18694
diff changeset
390 i_unlink(dest_path);
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
391 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
392 /* who knows what happened to the file. keep both just to be
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
393 sure both won't get deleted. */
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
394 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
395 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
396
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
397 /* file was successfully moved - reopen it */
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
398 dbox_file_close(file);
12332
9e400f6963eb dbox: Reverted the "check if altpath is mounted" change for now.
Timo Sirainen <tss@iki.fi>
parents: 12327
diff changeset
399 if (dbox_file_open(file, &deleted) <= 0) {
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
400 mail_storage_set_critical(storage,
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
401 "dbox_file_move(%s): reopening file failed", dest_path);
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
402 return -1;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
403 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
404 return 0;
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
405 }
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
406
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
407 static int
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
408 sdbox_unlink_attachments(struct sdbox_file *sfile,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
409 const ARRAY_TYPE(mail_attachment_extref) *extrefs)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
410 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
411 struct dbox_storage *storage = sfile->file.storage;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
412 const struct mail_attachment_extref *extref;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
413 const char *path;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
414 int ret = 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
415
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
416 array_foreach(extrefs, extref) T_BEGIN {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
417 path = sdbox_file_attachment_relpath(sfile, extref->path);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
418 if (index_attachment_delete(&storage->storage,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
419 storage->attachment_fs, path) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
420 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
421 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
422 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
423 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
424
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
425 int sdbox_file_unlink_with_attachments(struct sdbox_file *sfile)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
426 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
427 ARRAY_TYPE(mail_attachment_extref) extrefs;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
428 const char *extrefs_line;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
429 pool_t pool;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
430 int ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
431
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
432 ret = sdbox_file_get_attachments(&sfile->file, &extrefs_line);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
433 if (ret < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
434 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
435 if (ret == 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
436 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
437 return dbox_file_unlink(&sfile->file);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
438 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
439
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
440 pool = pool_alloconly_create("sdbox attachments unlink", 1024);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
441 p_array_init(&extrefs, pool, 16);
16946
0ed18f77ff08 lib-storage: Moved more of dbox attachments code to generic code.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
442 if (!index_attachment_parse_extrefs(extrefs_line, pool, &extrefs)) {
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
443 i_warning("%s: Ignoring corrupted extref: %s",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
444 sfile->file.cur_path, extrefs_line);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
445 array_clear(&extrefs);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
446 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
447
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
448 /* try to delete the file first, so if it fails we don't have
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
449 missing attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
450 if ((ret = dbox_file_unlink(&sfile->file)) >= 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
451 (void)sdbox_unlink_attachments(sfile, &extrefs);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
452 pool_unref(&pool);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
453 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
454 }