Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-single/sdbox-file.c @ 11764:8ec35eb6d7b3 HEAD
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 09 Jul 2010 15:39:03 +0100 |
parents | 1bb98ad1af8b |
children | 28eaaa23f2c6 |
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" |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #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
|
10 #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
|
11 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdio.h> |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 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
|
15 { |
10710
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
16 struct mailbox *box = &file->mbox->box; |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
17 const char *alt_path; |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
18 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 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
|
20 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
|
21 file->file.primary_path = |
10710
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
22 i_strdup_printf("%s/%s", box->path, fname); |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
23 |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
24 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
|
25 MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX); |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
26 if (alt_path != NULL) |
3d7fb69184b3
sdbox: Fixed accessing alt directories.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
27 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
|
28 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 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
|
31 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 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
|
33 const char *fname; |
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 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
|
36 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
|
37 file->mbox = mbox; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 T_BEGIN { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 if (uid != 0) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 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
|
42 file->uid = uid; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 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
|
45 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
|
46 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
|
47 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
|
48 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } T_END; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 dbox_file_init(&file->file); |
10965
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
51 return &file->file; |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
52 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
10965
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
54 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
|
55 { |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
56 struct dbox_file *file; |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
57 |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
58 file = sdbox_file_init(mbox, 0); |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
59 file->fd = file->storage->v. |
1bb98ad1af8b
sdbox: Copying is now done with hard links.
Timo Sirainen <tss@iki.fi>
parents:
10710
diff
changeset
|
60 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
|
61 return file; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 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
|
65 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 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
|
67 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 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
|
69 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
|
70 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 new_fname); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 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
|
76 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
|
77 "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
|
78 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
|
79 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 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
|
82 file->uid = uid; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 return 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 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
|
87 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 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
|
92 int fd; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 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
|
95 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
|
96 umask(old_mask); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 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
|
98 (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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 "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
|
105 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 /* try again */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 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
|
109 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
|
110 umask(old_mask); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 if (fd == -1) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 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
|
114 "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
|
115 } 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
|
116 /* no group change */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 } 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
|
118 if (errno == EPERM) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 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
|
120 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
|
121 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
|
122 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
|
123 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 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
|
125 "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
|
126 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
|
127 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 /* continue anyway */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 return fd; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 } |
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
|
132 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
133 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
|
134 { |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 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
|
141 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
142 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
|
143 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
144 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
|
145 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
|
146 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
147 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
|
148 /* 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
|
149 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
|
150 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
151 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
152 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
|
153 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
159 /* 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
|
160 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
|
161 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
|
162 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
|
163 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
|
164 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 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
|
173 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
|
174 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
|
175 } 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
|
176 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
|
177 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
|
178 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
|
179 } 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
|
180 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
|
181 "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
|
182 "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
|
183 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
|
184 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
185 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
|
186 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 "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
|
191 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
|
192 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
193 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
194 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
|
195 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
|
196 "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
|
197 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
|
198 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
199 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
|
200 (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
|
201 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
|
202 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
203 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
204 /* 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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 "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
|
210 (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
|
211 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
|
212 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
213 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
|
214 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
|
215 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
|
216 "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
|
217 (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
|
218 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
|
219 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
220 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
221 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
|
222 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
|
223 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
|
224 /* 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
|
225 (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
|
226 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
227 /* 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
|
228 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
|
229 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
|
230 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
231 |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
232 /* 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
|
233 dbox_file_close(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
|
234 if (dbox_file_open(file, &deleted) <= 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
|
235 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
|
236 "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
|
237 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
|
238 } |
8ec35eb6d7b3
dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents:
10965
diff
changeset
|
239 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
|
240 } |