Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/mbox/mbox-storage.c @ 947:f5658274245f HEAD
If ~/mail isn't found, create it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 11 Jan 2003 17:44:16 +0200 |
parents | fd8888f6f037 |
children | 8028c4dcf38f |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "lib.h" | |
4 #include "unlink-directory.h" | |
5 #include "subscription-file/subscription-file.h" | |
175
73bf05a1d862
Moved custom flags handling into lib-index.
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
6 #include "mail-custom-flags.h" |
0 | 7 #include "mbox-index.h" |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
8 #include "mbox-lock.h" |
0 | 9 #include "mbox-storage.h" |
10 | |
11 #include <stdio.h> | |
12 #include <stdlib.h> | |
13 #include <unistd.h> | |
14 #include <fcntl.h> | |
15 #include <sys/stat.h> | |
16 | |
17 #define CREATE_MODE 0770 /* umask() should limit it more */ | |
18 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
19 extern struct mail_storage mbox_storage; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
20 extern struct mailbox mbox_mailbox; |
0 | 21 |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
22 static int mkdir_parents(const char *path) |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
23 { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
24 const char *p, *dir; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
25 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
26 p = path; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
27 if (*p == '/') p++; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
28 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
29 do { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
30 t_push(); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
31 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
32 p = strchr(p, '/'); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
33 if (p == NULL) |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
34 dir = path; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
35 else { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
36 dir = t_strdup_until(path, p); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
37 p++; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
38 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
39 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
40 if (mkdir(dir, CREATE_MODE) < 0 && errno != EEXIST) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
41 t_pop(); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
42 return -1; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
43 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
44 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
45 t_pop(); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
46 } while (p != NULL); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
47 |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
48 return 0; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
49 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
50 |
0 | 51 static int mbox_autodetect(const char *data) |
52 { | |
53 const char *path; | |
54 struct stat st; | |
55 | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
56 /* Is it INBOX file? */ |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
57 if (*data != '\0' && stat(data, &st) == 0 && !S_ISDIR(st.st_mode) && |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
58 access(data, R_OK|W_OK) == 0) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
59 return TRUE; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
60 |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
61 /* or directory for IMAP folders? */ |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
62 path = t_strconcat(data, "/.imap", NULL); |
0 | 63 if (stat(path, &st) == 0 && S_ISDIR(st.st_mode) && |
64 access(path, R_OK|W_OK|X_OK) == 0) | |
65 return TRUE; | |
66 | |
67 path = t_strconcat(data, "/inbox", NULL); | |
68 if (stat(path, &st) == 0 && !S_ISDIR(st.st_mode) && | |
69 access(path, R_OK|W_OK) == 0) | |
70 return TRUE; | |
71 | |
72 path = t_strconcat(data, "/mbox", NULL); | |
73 if (stat(path, &st) == 0 && !S_ISDIR(st.st_mode) && | |
74 access(path, R_OK|W_OK) == 0) | |
75 return TRUE; | |
76 | |
77 return FALSE; | |
78 } | |
79 | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
80 static const char *get_root_dir(void) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
81 { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
82 const char *home, *path; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
83 |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
84 if (mbox_autodetect("")) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
85 return "/"; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
86 |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
87 home = getenv("HOME"); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
88 if (home != NULL) { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
89 path = t_strconcat(home, "/mail", NULL); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
90 if (access(path, R_OK|W_OK|X_OK) == 0) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
91 return path; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
92 |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
93 path = t_strconcat(home, "/Mail", NULL); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
94 if (access(path, R_OK|W_OK|X_OK) == 0) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
95 return path; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
96 } |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
97 |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
98 return NULL; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
99 } |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
100 |
947
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
101 static const char *create_root_dir(void) |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
102 { |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
103 const char *home, *path; |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
104 |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
105 home = getenv("HOME"); |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
106 if (home == NULL) { |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
107 i_error("mbox: We need root IMAP folder, " |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
108 "but can't find it or HOME environment"); |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
109 return NULL; |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
110 } |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
111 |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
112 path = t_strconcat(home, "/mail", NULL); |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
113 if (mkdir(path, CREATE_MODE) < 0) { |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
114 i_error("mbox: Can't create root IMAP folder %s: %m", path); |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
115 return NULL; |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
116 } |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
117 |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
118 return path; |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
119 } |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
120 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
121 static struct mail_storage *mbox_create(const char *data, const char *user) |
0 | 122 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
123 struct mail_storage *storage; |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
124 const char *root_dir, *inbox_file, *index_dir, *p; |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
125 struct stat st; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
126 |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
127 root_dir = inbox_file = index_dir = NULL; |
0 | 128 |
129 if (data == NULL || *data == '\0') { | |
130 /* we'll need to figure out the mail location ourself. | |
131 it's root dir if we've already chroot()ed, otherwise | |
132 either $HOME/mail or $HOME/Mail */ | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
133 root_dir = get_root_dir(); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
134 } else { |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
135 /* <root folder> | <INBOX path> |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
136 [:INBOX=<path>] [:INDEX=<dir>] */ |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
137 p = strchr(data, ':'); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
138 if (p == NULL) { |
869
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
139 if (stat(data, &st) < 0) { |
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
140 i_error("Invalid mbox file %s: %m", data); |
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
141 return NULL; |
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
142 } |
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
143 |
2873d04a566e
Complain about missing mbox file.
Timo Sirainen <tss@iki.fi>
parents:
828
diff
changeset
|
144 if (S_ISDIR(st.st_mode)) |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
145 root_dir = data; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
146 else { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
147 root_dir = get_root_dir(); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
148 inbox_file = data; |
0 | 149 } |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
150 } else { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
151 root_dir = t_strdup_until(data, p); |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
152 do { |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
153 p++; |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
154 if (strncmp(p, "INBOX=", 6) == 0) |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
155 inbox_file = t_strcut(p+6, ':'); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
156 else if (strncmp(p, "INDEX=", 6) == 0) |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
157 index_dir = t_strcut(p+6, ':'); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
158 p = strchr(p, ':'); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
159 } while (p != NULL); |
0 | 160 } |
161 } | |
162 | |
947
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
163 if (root_dir == NULL) { |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
164 root_dir = create_root_dir(); |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
165 if (root_dir == NULL) |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
166 return NULL; |
f5658274245f
If ~/mail isn't found, create it.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
167 } |
0 | 168 |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
169 if (inbox_file == NULL) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
170 inbox_file = t_strconcat(root_dir, "/inbox", NULL); |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
171 if (index_dir == NULL) |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
172 index_dir = root_dir; |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
173 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
174 storage = i_new(struct mail_storage, 1); |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
175 memcpy(storage, &mbox_storage, sizeof(struct mail_storage)); |
0 | 176 |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
177 storage->dir = i_strdup(root_dir); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
178 storage->inbox_file = i_strdup(inbox_file); |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
179 storage->index_dir = i_strdup(index_dir); |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
180 storage->user = i_strdup(user); |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
181 storage->callbacks = i_new(struct mail_storage_callbacks, 1); |
0 | 182 return storage; |
183 } | |
184 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
185 static void mbox_free(struct mail_storage *storage) |
0 | 186 { |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
187 i_free(storage->dir); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
188 i_free(storage->inbox_file); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
189 i_free(storage->index_dir); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
190 i_free(storage->user); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
191 i_free(storage->error); |
674
b7aefd0d7611
Locking changes triggered a bit larger cleanup :) If we have to wait for a
Timo Sirainen <tss@iki.fi>
parents:
625
diff
changeset
|
192 i_free(storage->callbacks); |
0 | 193 i_free(storage); |
194 } | |
195 | |
757 | 196 int mbox_is_valid_mask(const char *mask) |
0 | 197 { |
24
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
198 const char *p; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
199 int newdir; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
200 |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
201 /* make sure there's no "../" or "..\" stuff */ |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
202 newdir = TRUE; |
757 | 203 for (p = mask; *p != '\0'; p++) { |
24
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
204 if (newdir && p[0] == '.' && p[1] == '.' && |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
205 (p[2] == '/' || p[2] == '\\')) |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
206 return FALSE; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
207 newdir = p[0] == '/' || p[0] == '\\'; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
208 } |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
209 |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
210 return TRUE; |
0 | 211 } |
212 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
213 static int mbox_is_valid_name(struct mail_storage *storage, const char *name) |
757 | 214 { |
809
27554afad17e
Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
215 return name[0] != '\0' && name[0] != storage->hierarchy_sep && |
27554afad17e
Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
216 name[strlen(name)-1] != storage->hierarchy_sep && |
27554afad17e
Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
217 strchr(name, '*') == NULL && strchr(name, '%') == NULL && |
27554afad17e
Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
218 mbox_is_valid_mask(name); |
757 | 219 } |
220 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
221 static const char *mbox_get_index_dir(struct mail_storage *storage, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
222 const char *name) |
0 | 223 { |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
224 const char *p; |
0 | 225 |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
226 p = strrchr(name, '/'); |
0 | 227 if (p == NULL) |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
228 return t_strconcat(storage->index_dir, "/.imap/", name, NULL); |
0 | 229 else { |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
230 return t_strconcat(storage->index_dir, t_strdup_until(name, p), |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
231 "/.imap/", p+1, NULL); |
0 | 232 } |
233 } | |
234 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
235 static int create_mbox_index_dirs(struct mail_storage *storage, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
236 const char *name, int verify) |
0 | 237 { |
238 const char *index_dir, *imap_dir; | |
239 | |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
240 index_dir = mbox_get_index_dir(storage, name); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
241 imap_dir = t_strdup_until(index_dir, strstr(index_dir, ".imap/") + 5); |
0 | 242 |
243 if (mkdir(imap_dir, CREATE_MODE) == -1 && errno != EEXIST) | |
244 return FALSE; | |
245 if (mkdir(index_dir, CREATE_MODE) == -1 && (errno != EEXIST || !verify)) | |
246 return FALSE; | |
247 | |
248 return TRUE; | |
249 } | |
250 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
251 static void verify_inbox(struct mail_storage *storage) |
0 | 252 { |
253 int fd; | |
254 | |
255 /* make sure inbox file itself exists */ | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
256 fd = open(storage->inbox_file, O_RDWR | O_CREAT | O_EXCL, 0660); |
0 | 257 if (fd != -1) |
258 (void)close(fd); | |
259 | |
260 /* make sure the index directories exist */ | |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
261 (void)create_mbox_index_dirs(storage, "INBOX", TRUE); |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
262 } |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
263 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
264 static const char *mbox_get_path(struct mail_storage *storage, const char *name) |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
265 { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
266 if (strcasecmp(name, "INBOX") == 0) |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
267 return storage->inbox_file; |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
268 else |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
269 return t_strconcat(storage->dir, "/", name, NULL); |
0 | 270 } |
271 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
272 static struct mailbox *mbox_open(struct mail_storage *storage, const char *name, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
273 int readonly, int fast) |
0 | 274 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
275 struct index_mailbox *ibox; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
276 struct mail_index *index; |
0 | 277 const char *path, *index_dir; |
278 | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
279 if (strcasecmp(name, "INBOX") == 0) { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
280 /* name = "INBOX" |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
281 path = "<inbox_file>/INBOX" |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
282 index_dir = "/mail/.imap/INBOX" */ |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
283 path = storage->inbox_file; |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
284 index_dir = mbox_get_index_dir(storage, "/INBOX"); |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
285 } else { |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
286 /* name = "foo/bar" |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
287 path = "/mail/foo/bar" |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
288 index_dir = "/mail/foo/.imap/bar" */ |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
289 path = mbox_get_path(storage, name); |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
290 index_dir = mbox_get_index_dir(storage, name); |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
291 } |
0 | 292 |
450
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
293 index = index_storage_lookup_ref(index_dir); |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
294 if (index == NULL) { |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
295 index = mbox_index_alloc(index_dir, path); |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
296 index_storage_add(index); |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
297 } |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
298 |
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
299 ibox = index_storage_init(storage, &mbox_mailbox, index, |
296
d66aa1f1fb2d
Added fast-flag for mailbox opening, which doesn't do any index compressing
Timo Sirainen <tss@iki.fi>
parents:
196
diff
changeset
|
300 name, readonly, fast); |
600
3b44bc64afd4
mailbox_check_interval setting: Dovecot can notify client of new mail in
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
301 if (ibox != NULL) { |
0 | 302 ibox->expunge_locked = mbox_expunge_locked; |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
303 index_mailbox_check_add(ibox, index->mailbox_path); |
600
3b44bc64afd4
mailbox_check_interval setting: Dovecot can notify client of new mail in
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
304 } |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
305 return (struct mailbox *) ibox; |
0 | 306 } |
307 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
308 static struct mailbox * |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
309 mbox_open_mailbox(struct mail_storage *storage, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
310 const char *name, int readonly, int fast) |
0 | 311 { |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
312 const char *path; |
0 | 313 struct stat st; |
314 | |
315 mail_storage_clear_error(storage); | |
316 | |
317 /* INBOX is always case-insensitive */ | |
318 if (strcasecmp(name, "INBOX") == 0) { | |
319 /* make sure inbox exists */ | |
320 verify_inbox(storage); | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
321 return mbox_open(storage, "INBOX", readonly, fast); |
0 | 322 } |
323 | |
24
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
324 if (!mbox_is_valid_name(storage, name)) { |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
325 mail_storage_set_error(storage, "Invalid mailbox name"); |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
326 return FALSE; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
327 } |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
328 |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
329 path = mbox_get_path(storage, name); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
330 if (stat(path, &st) == 0) { |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
331 if (S_ISDIR(st.st_mode)) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
332 mail_storage_set_error(storage, |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
333 "Mailbox isn't selectable: %s", name); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
334 return NULL; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
335 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
336 |
0 | 337 /* exists - make sure the required directories are also there */ |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
338 (void)create_mbox_index_dirs(storage, name, TRUE); |
0 | 339 |
296
d66aa1f1fb2d
Added fast-flag for mailbox opening, which doesn't do any index compressing
Timo Sirainen <tss@iki.fi>
parents:
196
diff
changeset
|
340 return mbox_open(storage, name, readonly, fast); |
0 | 341 } else if (errno == ENOENT) { |
136
899ea73710fc
"Mailbox doesn't exist" error now gives the name of the mailbox that was
Timo Sirainen <tss@iki.fi>
parents:
24
diff
changeset
|
342 mail_storage_set_error(storage, "Mailbox doesn't exist: %s", |
899ea73710fc
"Mailbox doesn't exist" error now gives the name of the mailbox that was
Timo Sirainen <tss@iki.fi>
parents:
24
diff
changeset
|
343 name); |
0 | 344 return NULL; |
345 } else { | |
346 mail_storage_set_critical(storage, "Can't open mailbox %s: %m", | |
347 name); | |
348 return NULL; | |
349 } | |
350 } | |
351 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
352 static int mbox_create_mailbox(struct mail_storage *storage, const char *name) |
0 | 353 { |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
354 const char *path, *p; |
0 | 355 struct stat st; |
356 int fd; | |
357 | |
358 mail_storage_clear_error(storage); | |
359 | |
360 if (strcasecmp(name, "INBOX") == 0) | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
361 name = "INBOX"; |
0 | 362 |
363 if (!mbox_is_valid_name(storage, name)) { | |
364 mail_storage_set_error(storage, "Invalid mailbox name"); | |
365 return FALSE; | |
366 } | |
367 | |
368 /* make sure it doesn't exist already */ | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
369 path = mbox_get_path(storage, name); |
0 | 370 if (stat(path, &st) == 0) { |
371 mail_storage_set_error(storage, "Mailbox already exists"); | |
372 return FALSE; | |
373 } | |
374 | |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
375 if (errno == ENOTDIR) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
376 mail_storage_set_error(storage, |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
377 "Mailbox doesn't allow inferior mailboxes"); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
378 return FALSE; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
379 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
380 |
305
21a9d15025c7
CREATE and DELETE fixes for mbox (last changes for .98 :)
Timo Sirainen <tss@iki.fi>
parents:
296
diff
changeset
|
381 if (errno != ENOENT) { |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
382 mail_storage_set_critical(storage, |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
383 "stat() failed for mbox file %s: %m", path); |
0 | 384 return FALSE; |
385 } | |
386 | |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
387 /* create the hierarchy if needed */ |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
388 p = strrchr(path, '/'); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
389 if (p != NULL) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
390 if (mkdir_parents(t_strdup_until(path, p)) < 0) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
391 mail_storage_set_critical(storage, |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
392 "mkdir_parents() failed for mbox path %s: %m", |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
393 path); |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
394 return FALSE; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
395 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
396 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
397 |
0 | 398 /* create the mailbox file */ |
305
21a9d15025c7
CREATE and DELETE fixes for mbox (last changes for .98 :)
Timo Sirainen <tss@iki.fi>
parents:
296
diff
changeset
|
399 fd = open(path, O_RDWR | O_CREAT | O_EXCL, 0660); |
0 | 400 if (fd != -1) { |
401 (void)close(fd); | |
402 return TRUE; | |
403 } else if (errno == EEXIST) { | |
404 /* mailbox was just created between stat() and open() call.. */ | |
405 mail_storage_set_error(storage, "Mailbox already exists"); | |
406 return FALSE; | |
407 } else { | |
408 mail_storage_set_critical(storage, "Can't create mailbox " | |
409 "%s: %m", name); | |
410 return FALSE; | |
411 } | |
412 } | |
413 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
414 static int mbox_delete_mailbox(struct mail_storage *storage, const char *name) |
0 | 415 { |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
416 const char *index_dir, *path; |
828
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
417 struct stat st; |
0 | 418 |
419 mail_storage_clear_error(storage); | |
420 | |
421 if (strcasecmp(name, "INBOX") == 0) { | |
422 mail_storage_set_error(storage, "INBOX can't be deleted."); | |
423 return FALSE; | |
424 } | |
425 | |
24
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
426 if (!mbox_is_valid_name(storage, name)) { |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
427 mail_storage_set_error(storage, "Invalid mailbox name"); |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
428 return FALSE; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
429 } |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
430 |
828
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
431 path = mbox_get_path(storage, name); |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
432 if (lstat(path, &st) < 0) { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
433 if (errno == ENOENT) { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
434 mail_storage_set_error(storage, |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
435 "Mailbox doesn't exist: %s", |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
436 name); |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
437 } else { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
438 mail_storage_set_critical(storage, "lstat() failed for " |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
439 "%s: %m", path); |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
440 } |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
441 return FALSE; |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
442 } |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
443 |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
444 if (S_ISDIR(st.st_mode)) { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
445 /* deleting a folder, only allow it if it's empty */ |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
446 if (rmdir(path) == 0) |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
447 return TRUE; |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
448 |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
449 if (errno == ENOTEMPTY) { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
450 mail_storage_set_error(storage, "Folder %s " |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
451 "isn't empty, can't delete it.", |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
452 name); |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
453 } else { |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
454 mail_storage_set_critical(storage, "rmdir() failed for " |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
455 "%s: %m", path); |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
456 } |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
457 return FALSE; |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
458 } |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
459 |
0 | 460 /* first unlink the mbox file */ |
828
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
461 if (unlink(path) < 0) { |
0 | 462 if (errno == ENOENT) { |
463 mail_storage_set_error(storage, | |
136
899ea73710fc
"Mailbox doesn't exist" error now gives the name of the mailbox that was
Timo Sirainen <tss@iki.fi>
parents:
24
diff
changeset
|
464 "Mailbox doesn't exist: %s", |
899ea73710fc
"Mailbox doesn't exist" error now gives the name of the mailbox that was
Timo Sirainen <tss@iki.fi>
parents:
24
diff
changeset
|
465 name); |
0 | 466 } else { |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
757
diff
changeset
|
467 mail_storage_set_critical(storage, |
828
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
468 "unlink() failed for %s: %m", |
774f32498a7f
We couldn't delete mbox folders.
Timo Sirainen <tss@iki.fi>
parents:
822
diff
changeset
|
469 path); |
0 | 470 } |
471 return FALSE; | |
472 } | |
473 | |
474 /* next delete the index directory */ | |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
475 index_dir = mbox_get_index_dir(storage, name); |
822
5101f8bf2368
If used base/login directories exist already, make sure they're with correct
Timo Sirainen <tss@iki.fi>
parents:
817
diff
changeset
|
476 if (unlink_directory(index_dir, TRUE) < 0 && errno != ENOENT) { |
0 | 477 mail_storage_set_critical(storage, "unlink_directory(%s) " |
478 "failed: %m", index_dir); | |
479 return FALSE; | |
480 } | |
481 return TRUE; | |
482 } | |
483 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
484 static int mbox_rename_mailbox(struct mail_storage *storage, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
485 const char *oldname, const char *newname) |
0 | 486 { |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
487 const char *oldpath, *newpath, *old_indexdir, *new_indexdir, *p; |
0 | 488 |
489 mail_storage_clear_error(storage); | |
490 | |
24
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
491 if (!mbox_is_valid_name(storage, oldname) || |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
492 !mbox_is_valid_name(storage, newname)) { |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
493 mail_storage_set_error(storage, "Invalid mailbox name"); |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
494 return FALSE; |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
495 } |
e8de6f485c65
Don't allow using "../" anywhere in mailbox names.
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
496 |
0 | 497 if (strcasecmp(oldname, "INBOX") == 0) |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
498 oldname = "INBOX"; |
0 | 499 |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
500 oldpath = mbox_get_path(storage, oldname); |
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
501 newpath = mbox_get_path(storage, newname); |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
757
diff
changeset
|
502 |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
503 /* create the hierarchy */ |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
504 p = strrchr(newpath, '/'); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
505 if (p != NULL) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
506 if (mkdir_parents(t_strdup_until(newpath, p)) < 0) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
507 mail_storage_set_critical(storage, |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
508 "mkdir_parents() failed for mbox path %s: %m", |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
509 newpath); |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
510 return FALSE; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
511 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
512 } |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
513 |
0 | 514 /* NOTE: renaming INBOX works just fine with us, it's simply created |
515 the next time it's needed. */ | |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
757
diff
changeset
|
516 if (link(oldpath, newpath) == 0) |
0 | 517 (void)unlink(oldpath); |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
757
diff
changeset
|
518 else if (errno == EEXIST) { |
0 | 519 mail_storage_set_error(storage, |
520 "Target mailbox already exists"); | |
521 return FALSE; | |
522 } else { | |
523 mail_storage_set_critical(storage, "link(%s, %s) failed: %m", | |
524 oldpath, newpath); | |
525 return FALSE; | |
526 } | |
527 | |
528 /* we need to rename the index directory as well */ | |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
529 old_indexdir = mbox_get_index_dir(storage, oldname); |
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
530 new_indexdir = mbox_get_index_dir(storage, newname); |
0 | 531 (void)rename(old_indexdir, new_indexdir); |
532 | |
533 return TRUE; | |
534 } | |
535 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
536 static int mbox_get_mailbox_name_status(struct mail_storage *storage, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
537 const char *name, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
538 enum mailbox_name_status *status) |
0 | 539 { |
540 struct stat st; | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
541 const char *path; |
0 | 542 |
543 mail_storage_clear_error(storage); | |
544 | |
545 if (strcasecmp(name, "INBOX") == 0) | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
546 name = "INBOX"; |
0 | 547 |
548 if (!mbox_is_valid_name(storage, name)) { | |
549 *status = MAILBOX_NAME_INVALID; | |
550 return TRUE; | |
551 } | |
552 | |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
553 path = mbox_get_path(storage, name); |
0 | 554 if (stat(path, &st) == 0) { |
555 *status = MAILBOX_NAME_EXISTS; | |
556 return TRUE; | |
557 } else if (errno == ENOENT) { | |
558 *status = MAILBOX_NAME_VALID; | |
559 return TRUE; | |
890
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
560 } else if (errno == ENOTDIR) { |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
561 *status = MAILBOX_NAME_NOINFERIORS; |
079a620c0261
CREATE and RENAME should create the folder hierarchy if needed. SELECTing a
Timo Sirainen <tss@iki.fi>
parents:
883
diff
changeset
|
562 return TRUE; |
0 | 563 } else { |
564 mail_storage_set_critical(storage, "mailbox name status: " | |
565 "stat(%s) failed: %m", path); | |
566 return FALSE; | |
567 } | |
568 } | |
569 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
570 static int mbox_storage_close(struct mailbox *box) |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
571 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
572 struct index_mailbox *ibox = (struct index_mailbox *) box; |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
573 int failed = FALSE; |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
574 |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
575 /* update flags by rewrite mbox file */ |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
576 if (!mbox_index_rewrite(ibox->index)) { |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
577 mail_storage_set_index_error(ibox); |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
578 failed = TRUE; |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
579 } |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
580 |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
581 return index_storage_close(box) && !failed; |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
582 } |
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
583 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
584 struct mail_storage mbox_storage = { |
0 | 585 "mbox", /* name */ |
586 | |
587 '/', /* hierarchy_sep - can't be changed */ | |
588 | |
589 mbox_create, | |
590 mbox_free, | |
591 mbox_autodetect, | |
674
b7aefd0d7611
Locking changes triggered a bit larger cleanup :) If we have to wait for a
Timo Sirainen <tss@iki.fi>
parents:
625
diff
changeset
|
592 index_storage_set_callbacks, |
0 | 593 mbox_open_mailbox, |
594 mbox_create_mailbox, | |
595 mbox_delete_mailbox, | |
596 mbox_rename_mailbox, | |
597 mbox_find_mailboxes, | |
598 subsfile_set_subscribed, | |
599 mbox_find_subscribed, | |
600 mbox_get_mailbox_name_status, | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
601 mail_storage_get_last_error, |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
602 |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
603 NULL, |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
604 NULL, |
674
b7aefd0d7611
Locking changes triggered a bit larger cleanup :) If we have to wait for a
Timo Sirainen <tss@iki.fi>
parents:
625
diff
changeset
|
605 NULL, |
815
ef64c9a50326
Support for separate location of mbox INBOX folder.
Timo Sirainen <tss@iki.fi>
parents:
809
diff
changeset
|
606 NULL, |
817
86cf24da85f1
Added :INDEX=<dir> for both Maildir and mbox to specify different location
Timo Sirainen <tss@iki.fi>
parents:
815
diff
changeset
|
607 NULL, |
883
39e0b536e708
Storage can now specify if errors should be sent to user as BAD or NO.
Timo Sirainen <tss@iki.fi>
parents:
869
diff
changeset
|
608 NULL, NULL, |
39e0b536e708
Storage can now specify if errors should be sent to user as BAD or NO.
Timo Sirainen <tss@iki.fi>
parents:
869
diff
changeset
|
609 |
39e0b536e708
Storage can now specify if errors should be sent to user as BAD or NO.
Timo Sirainen <tss@iki.fi>
parents:
869
diff
changeset
|
610 0 |
0 | 611 }; |
612 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
890
diff
changeset
|
613 struct mailbox mbox_mailbox = { |
0 | 614 NULL, /* name */ |
615 NULL, /* storage */ | |
616 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
136
diff
changeset
|
617 mbox_storage_close, |
0 | 618 index_storage_get_status, |
619 index_storage_sync, | |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
620 index_storage_expunge, |
0 | 621 index_storage_update_flags, |
622 index_storage_copy, | |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
623 index_storage_fetch, |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
624 index_storage_search, |
0 | 625 mbox_storage_save, |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
626 mail_storage_is_inconsistency_error, |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
627 |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
628 FALSE, |
450
925d6eb5f8be
MailStorage interface change. We now let storage call several sync-functions
Timo Sirainen <tss@iki.fi>
parents:
329
diff
changeset
|
629 FALSE, |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
630 FALSE |
0 | 631 }; |