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