Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-single/sdbox-file.c @ 19697:204d695073de
sdbox: Failing after saved mails' UIDs were already assigned caused unlink()ing garbage
Mainly with dsync when it fails, the transaction is still committed and
mails are given UIDs. If the transaction commit still fails, it attempts to
rollback the saved mails by unlink()ing them, but at that point the path
pointed to an already freed memory. This caused unlink() errors with some
garbage strings as the path (and hopefully no actually valid paths).
The easiest way to reproduce this was to fill up the filesystem with dsync.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 01 Feb 2016 22:48:22 +0200 |
parents | 0f22db71df7a |
children | 932a63ff512e |
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 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 { |
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
|
152 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
|
153 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
|
154 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 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
|
156 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
|
157 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 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
|
159 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
|
160 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
|
161 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
|
162 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 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
|
164 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
|
165 |
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 if (stat(new_path, &st) == 0) { |
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
|
167 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
|
168 "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
|
169 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
|
170 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
|
171 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 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
|
174 "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
|
175 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
|
176 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 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
|
179 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
|
180 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
181 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
|
182 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
|
183 return -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
184 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 return 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
188 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
|
189 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
190 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
|
191 struct fs *fs = storage->attachment_fs; |
15198
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
192 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
|
193 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
|
194 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
|
195 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
196 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
|
197 /* 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
|
198 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
|
199 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
|
200 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
|
201 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
|
202 *pathp); |
15198
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
203 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
|
204 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
|
205 errno != ENOENT) { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
206 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
|
207 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
|
208 ret = -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
209 } |
15198
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
210 fs_file_deinit(&fs_file); |
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
211 |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
212 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
|
213 sdbox_file_attachment_relpath(file, *pathp)); |
15198
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
214 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
|
215 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
|
216 errno != ENOENT) { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
217 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
|
218 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
|
219 ret = -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
220 } |
15198
ce57bacc3010
lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
221 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
|
222 } T_END; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
223 return ret; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
224 } |
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 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
|
227 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
228 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
|
229 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
230 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
|
231 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
|
232 "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
|
233 ret = -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
234 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
235 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
|
236 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
|
237 ret = -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
238 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
239 return ret; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
240 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
241 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 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
|
243 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 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
|
245 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
|
246 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
|
247 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
|
248 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
|
249 int fd; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
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
|
251 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
|
252 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
|
253 umask(old_mask); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 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
|
255 (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
|
256 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
|
257 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
|
258 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
|
259 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
|
260 errno != EEXIST) { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 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
|
262 "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
|
263 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 /* 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
|
266 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
|
267 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
|
268 umask(old_mask); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 if (fd == -1) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 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
|
272 "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
|
273 } 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
|
274 /* 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
|
275 } 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
|
276 if (errno == EPERM) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 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
|
281 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 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
|
283 "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
|
284 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
|
285 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 /* continue anyway */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 return fd; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 } |
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
|
290 |
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 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
|
292 { |
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 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
|
294 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
|
295 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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 |
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 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
|
302 |
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 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
|
304 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
|
305 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
306 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
|
307 /* 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
|
308 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
|
309 } |
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 |
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 dest_path = !alt_path ? file->primary_path : 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
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 |
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 /* 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
|
319 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
|
320 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
|
321 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
|
322 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
|
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 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
|
325 i_stream_seek(file->input, 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
|
326 while ((ret = o_stream_send_istream(output, file->input)) > 0) ; |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14356
diff
changeset
|
327 if (o_stream_nfinish(output) < 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
|
328 mail_storage_set_critical(storage, "write(%s) failed: %m", |
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 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
|
330 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
|
331 } else if (file->input->stream_errno != 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
|
332 errno = file->input->stream_errno; |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
333 dbox_file_set_syscall_error(file, "ftruncate()"); |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
334 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
|
335 } else if (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
|
336 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
|
337 "o_stream_send_istream(%s, %s) " |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
338 "failed with unknown 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
|
339 temp_path, file->cur_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
|
340 } |
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 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
|
342 |
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 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
|
344 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
|
345 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
|
346 "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
|
347 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
|
348 } |
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 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
|
351 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
|
352 "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
|
353 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
|
354 } |
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 if (ret < 0) { |
19136
fefaa6d09a81
Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
18694
diff
changeset
|
356 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
|
357 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
|
358 } |
14009
10320252b521
sdbox: Preserve file's atime/mtime when moving it to alt storage.
Timo Sirainen <tss@iki.fi>
parents:
13287
diff
changeset
|
359 /* 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
|
360 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
|
361 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
|
362 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
|
363 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
|
364 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
|
365 "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
|
366 } |
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
|
367 |
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 /* 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
|
369 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
|
370 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
|
371 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
|
372 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
|
373 "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
|
374 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
|
375 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
|
376 } |
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 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
|
378 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
|
379 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
|
380 "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
|
381 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
|
382 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
|
383 } |
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 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
|
386 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
|
387 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
|
388 /* configuration problem? revert the write */ |
19136
fefaa6d09a81
Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
18694
diff
changeset
|
389 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
|
390 } |
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 /* 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
|
392 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
|
393 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
|
394 } |
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 /* 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
|
397 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
|
398 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
|
399 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
|
400 "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
|
401 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
|
402 } |
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 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
|
404 } |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
405 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
406 static int |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
407 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
|
408 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
|
409 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
410 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
|
411 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
|
412 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
|
413 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
|
414 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 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
|
419 ret = -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
420 } T_END; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
421 return ret; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
422 } |
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 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
|
425 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
426 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
|
427 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
|
428 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
|
429 int ret; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
430 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
431 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
|
432 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
|
433 return -1; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
434 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
|
435 /* no attachments */ |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
436 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
|
437 } |
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 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
|
440 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 } |
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 /* 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
|
448 missing attachments */ |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
449 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
|
450 (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
|
451 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
|
452 return ret; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11764
diff
changeset
|
453 } |