Mercurial > dovecot > core-2.2
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 |
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 } |