annotate src/lib-storage/index/dbox-single/sdbox-file.c @ 12332:9e400f6963eb

dbox: Reverted the "check if altpath is mounted" change for now. If alt path didn't yet exist, it reported bogus errors. It should somehow check if there is anything under the alt root dir.
author Timo Sirainen <tss@iki.fi>
date Thu, 21 Oct 2010 18:49:19 +0100
parents 099925543768
children b26d6da05d48 44d0474a451e
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
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
76 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
77 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
78 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
79 bool deleted;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
80 int ret;
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 *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
83
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
84 /* 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
85 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
86 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
87 if (deleted)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
88 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
89 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
90 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
91 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
92 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
93 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
94 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
95 /* 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
96 line = NULL;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
97 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
98 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
99 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
100 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
101 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
102 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
103 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
104 *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
105 return 1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
106 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
107
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
108 const char *
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
109 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
110 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
111 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
112
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
113 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
114 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
115 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
116 "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
117 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
118 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
119 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
120 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
121 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
122 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
123 file->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
124 }
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 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
127 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
128 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
129 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
130 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
131
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
132 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
133 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
134 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
135 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
136 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
137 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
138 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
139 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
140 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
141 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
142 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
143 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
144
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 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
146 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 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
148
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 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
150 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
151
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 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
153 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
154 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
155 new_fname);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 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
157 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
158 "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
159 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
160 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 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
163 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
164
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
165 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
166 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
167 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
168 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
172 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
173 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
174 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
175 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
176 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
177 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
178
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
179 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
180 /* 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
181 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
182 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
183 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
184 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
185 *pathp);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
186 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
187 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
188 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
189 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
190 ret = -1;
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 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
193 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
194 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
195 errno != ENOENT) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
196 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
197 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
198 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
199 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
200 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
201 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
202 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
203
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
204 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
205 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
206 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
207
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
208 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
209 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
210 "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
211 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
212 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
213 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
214 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
215 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
216 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
217 return ret;
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
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 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
221 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 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
223 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
224 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
225 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
226 int fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 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
229 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
230 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 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
232 (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
233 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
234 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
235 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
236 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
237 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
238 "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
239 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 /* try again */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 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
243 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
244 umask(old_mask);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 if (fd == -1) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 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
248 "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
249 } 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
250 /* no group change */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 } 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
252 if (errno == EPERM) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 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
254 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
255 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
256 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
257 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 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
259 "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
260 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
261 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 /* continue anyway */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 return fd;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 }
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
266
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
267 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
268 {
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
269 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
270 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
271 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
272 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
273 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
274 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
275
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
276 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
277
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
278 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
279 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
280
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
281 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
282 /* 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
283 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
284 }
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
285
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 10965
diff changeset
286 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
287 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
288 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
289 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
290 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
291 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
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 /* 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
294 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
295 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
296 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
297 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
298
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 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
300 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
301 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
302 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
303 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
304 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
305 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
306 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
307 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
308 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
309 } 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
310 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
311 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
312 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
313 } 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
314 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
315 "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
316 "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
317 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
318 }
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 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
320
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 (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
322 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
323 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
324 "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
325 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
326 }
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 }
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 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
329 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
330 "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
331 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
332 }
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 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
334 (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
335 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
336 }
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
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 /* 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
339 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
340 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
341 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
342 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
343 "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
344 (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
345 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
346 }
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 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
348 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
349 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
350 "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
351 (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
352 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
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 (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
356 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
357 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
358 /* 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
359 (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
360 }
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 /* 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
362 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
363 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
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
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 /* 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
367 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
368 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
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 "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
371 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
372 }
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 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
374 }
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
375
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
376 static int
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
377 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
378 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
379 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
380 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
381 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
382 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
383 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
384
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
385 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
386 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
387 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
388 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
389 ret = -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
390 } T_END;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
391 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
392 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
393
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
394 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
395 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
396 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
397 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
398 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
399 int ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
400
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
401 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
402 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
403 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
404 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
405 /* no attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
406 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
407 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
408
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
409 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
410 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
411 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
412 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
413 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
414 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
415 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
416
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
417 /* 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
418 missing attachments */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
419 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
420 (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
421 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
422 return ret;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
423 }