annotate src/lib-storage/index/dbox-single/sdbox-file.c @ 12327:099925543768

dbox: If alt path is lost, fail with an error rather than rebuilding indexes. This could be simply because alt storage is unmounted at the time and rebuilding would just lose messages. If this error happens unintentionally, it's still possible to fix it with "doveadm force-resync".
author Timo Sirainen <tss@iki.fi>
date Thu, 21 Oct 2010 16:33:28 +0100
parents 28eaaa23f2c6
children 9e400f6963eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
1 /* Copyright (c) 2007-2010 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>
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 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
18 {
10710
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
19 struct mailbox *box = &file->mbox->box;
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
20 const char *alt_path;
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
21
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 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
23 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
24 file->file.primary_path =
10710
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
25 i_strdup_printf("%s/%s", box->path, fname);
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
26
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
27 alt_path = mailbox_list_get_path(box->list, box->name,
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
28 MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
29 if (alt_path != NULL)
3d7fb69184b3 sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
30 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
31 }
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 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
34 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 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
36 const char *fname;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 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
39 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
40 file->mbox = mbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 T_BEGIN {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 if (uid != 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 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
44 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
45 file->uid = uid;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 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
48 i_strdup_printf("%s/%s",
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
49 file->mbox->box.path,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 dbox_generate_tmp_filename());
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 } T_END;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 dbox_file_init(&file->file);
10965
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
54 return &file->file;
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
55 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
10965
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
57 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
58 {
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
59 struct dbox_file *file;
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
60
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
61 file = sdbox_file_init(mbox, 0);
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
62 file->fd = file->storage->v.
1bb98ad1af8b sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
63 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
64 return file;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
67 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
68 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
69 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
70
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
71 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
72 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
73 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
74 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
75
12327
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
76 int sdbox_file_open(struct dbox_file *file, bool *deleted_r)
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
77 {
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
78 struct sdbox_file *sfile = (struct sdbox_file *)file;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
79 struct stat st;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
80 const char *alt_root;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
81 int ret;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
82
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
83 if ((ret = dbox_file_open(file, deleted_r)) <= 0 || !*deleted_r)
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
84 return ret;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
85
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
86 /* file appears to be deleted. check if the alt path root even exists
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
87 to avoid reindexing errors if alt path isn't mounted currently */
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
88 alt_root = mailbox_list_get_path(sfile->mbox->box.list, NULL,
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
89 MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
90 if (stat(alt_root, &st) == 0)
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
91 return 1;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
92 else if (errno == ENOENT) {
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
93 mail_storage_set_critical(&file->storage->storage,
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
94 "sdbox: User's alt path lost: %s", alt_root);
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
95 return -1;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
96 } else {
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
97 mail_storage_set_critical(&file->storage->storage,
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
98 "stat(%s) failed: %m", alt_root);
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
99 return -1;
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
100 }
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
101 }
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
102
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
103 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
104 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
105 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
106 bool deleted;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
107 int ret;
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 *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
110
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
111 /* read the metadata */
12327
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
112 ret = sdbox_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
113 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
114 if (deleted)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
115 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
116 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
117 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
118 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
119 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
120 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
121 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
122 /* 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
123 line = NULL;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
124 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
125 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
126 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
127 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
128 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
129 return 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 *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
132 return 1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
133 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
134
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
135 const char *
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
136 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
137 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
138 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
139
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
140 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
141 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
142 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
143 "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
144 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
145 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
146 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
147 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
148 p == NULL ? srcpath : t_strdup_until(srcpath, p),
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
149 mail_guid_128_to_string(file->mbox->mailbox_guid),
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
150 file->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
151 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
152
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
153 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
154 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
155 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
156 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
157 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
158
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
159 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
160 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
161 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
162 sdbox_file_attachment_relpath(file, *pathp));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
163 if (fs_rename(storage->attachment_fs, src, dest) < 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
164 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
165 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
166 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
167 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
168 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
169 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
170 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
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 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
173 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 const char *old_path, *new_fname, *new_path;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 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
177 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
178
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 old_path = file->file.cur_path;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 new_fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid);
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
181 new_path = t_strdup_printf("%s/%s", file->mbox->box.path,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 new_fname);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 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
184 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
185 "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
186 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
187 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 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
190 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
191
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
192 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
193 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
194 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
195 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
199 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
200 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
201 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
202 struct fs *fs = 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
203 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
204 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
205
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
206 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
207 /* 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
208 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
209 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
210 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
211 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
212 *pathp);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
213 if (fs_unlink(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
214 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
215 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
216 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
217 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
218 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
219 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
220 sdbox_file_attachment_relpath(file, *pathp));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
221 if (fs_unlink(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
222 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
223 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
224 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
225 ret = -1;
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 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
228 return ret;
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
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
231 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
232 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
233 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
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 (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
236 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
237 "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
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 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
241 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
242 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
243 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
244 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
245 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
246
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 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
248 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 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
250 struct mailbox *box = &sfile->mbox->box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 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
252 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
253 int fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 old_mask = umask(0666 & ~box->file_create_mode);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 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
257 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 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
259 (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
260 dir = t_strdup_until(path, p);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 if (mkdir_parents_chgrp(dir, box->dir_create_mode,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 box->file_create_gid,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 box->file_create_gid_origin) < 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 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
265 "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
266 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 /* try again */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 old_mask = umask(0666 & ~box->file_create_mode);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 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
271 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 if (fd == -1) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 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
275 "open(%s, O_CREAT) failed: %m", path);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 } else if (box->file_create_gid == (gid_t)-1) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 /* no group change */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 } else if (fchown(fd, (uid_t)-1, box->file_create_gid) < 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (errno == EPERM) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 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
281 eperm_error_get_chgrp("fchown", path,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 box->file_create_gid,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 box->file_create_gid_origin));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 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
286 "fchown(%s, -1, %ld) failed: %m",
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 path, (long)box->file_create_gid);
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 /* continue anyway */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 return fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 }
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
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 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
295 {
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 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
297 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
298 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
299 struct stat st;
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 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
301 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
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 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
304
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 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
306 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
307
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 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
309 /* 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
310 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
311 }
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 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
314 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
315 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
316 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
317 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
318 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
319
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 /* 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
321 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
322 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
323 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
324 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
325
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 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
327 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
328 while ((ret = o_stream_send_istream(output, 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
329 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
330 ret = o_stream_flush(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
331 if (output->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 = output->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 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
334 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
335 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
336 } 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
337 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
338 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
339 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
340 } 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
341 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
342 "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
343 "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
344 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
345 }
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 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
347
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 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
349 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
350 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
351 "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
352 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
353 }
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 (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
356 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
357 "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
358 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
359 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
360 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
361 (void)unlink(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
362 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
363 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
364
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
365 /* 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
366 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
367 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
368 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
369 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
370 "rename(%s, %s) failed: %m", temp_path, 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
371 (void)unlink(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
372 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
373 }
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 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
375 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
376 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
377 "fdatasync(%s) failed: %m", 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
378 (void)unlink(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
379 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
380 }
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 }
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 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
383 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
384 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
385 /* configuration problem? revert the write */
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 (void)unlink(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
387 }
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 /* 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
389 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
390 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
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
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 /* 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
394 dbox_file_close(file);
12327
099925543768 dbox: If alt path is lost, fail with an error rather than rebuilding indexes.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
395 if (sdbox_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
396 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
397 "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
398 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
399 }
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 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
401 }
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
402
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
403 static int
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
404 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
405 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
406 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
407 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
408 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
409 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
410 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
411
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
412 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
413 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
414 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
415 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
416 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
417 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
418 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
419 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
420
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
421 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
422 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
423 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
424 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
425 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
426 int ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
427
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
428 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
429 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
430 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
431 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
432 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
433 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
434 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
435
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
436 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
437 p_array_init(&extrefs, pool, 16);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
438 if (!dbox_attachment_parse_extref(extrefs_line, pool, &extrefs)) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
439 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
440 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
441 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
442 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
443
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
444 /* 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
445 missing attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
446 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
447 (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
448 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
449 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
450 }