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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "unlink-directory.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mbox-storage.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include <stdio.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdlib.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <unistd.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <fcntl.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <sys/stat.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #define CREATE_MODE 0770 /* umask() should limit it more */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 static int mbox_autodetect(const char *data)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 const char *path;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 struct stat st;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 if (stat(path, &st) == 0 && S_ISDIR(st.st_mode) &&
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 access(path, R_OK|W_OK|X_OK) == 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 path = t_strconcat(data, "/inbox", NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 if (stat(path, &st) == 0 && !S_ISDIR(st.st_mode) &&
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 access(path, R_OK|W_OK) == 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 path = t_strconcat(data, "/mbox", NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 if (stat(path, &st) == 0 && !S_ISDIR(st.st_mode) &&
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 access(path, R_OK|W_OK) == 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 if (data == NULL || *data == '\0') {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 /* we'll need to figure out the mail location ourself.
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 it's root dir if we've already chroot()ed, otherwise
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 return storage;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 i_free(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
757
5d80c93e6c52 Forgot to commit.
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
196 int mbox_is_valid_mask(const char *mask)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5d80c93e6c52 Forgot to commit.
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5d80c93e6c52 Forgot to commit.
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
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
5d80c93e6c52 Forgot to commit.
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
219 }
5d80c93e6c52 Forgot to commit.
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 const char *index_dir, *imap_dir;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (mkdir(imap_dir, CREATE_MODE) == -1 && errno != EEXIST)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 if (mkdir(index_dir, CREATE_MODE) == -1 && (errno != EEXIST || !verify))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 int fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (fd != -1)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 (void)close(fd);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 const char *path, *index_dir;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 struct stat st;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 mail_storage_clear_error(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 /* INBOX is always case-insensitive */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 if (strcasecmp(name, "INBOX") == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 /* make sure inbox exists */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 mail_storage_set_critical(storage, "Can't open mailbox %s: %m",
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 name);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 struct stat st;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 int fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 mail_storage_clear_error(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 if (!mbox_is_valid_name(storage, name)) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 mail_storage_set_error(storage, "Invalid mailbox name");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 if (stat(path, &st) == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 mail_storage_set_error(storage, "Mailbox already exists");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 if (fd != -1) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 (void)close(fd);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 } else if (errno == EEXIST) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 /* mailbox was just created between stat() and open() call.. */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 mail_storage_set_error(storage, "Mailbox already exists");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 mail_storage_set_critical(storage, "Can't create mailbox "
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 "%s: %m", name);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 mail_storage_clear_error(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 if (strcasecmp(name, "INBOX") == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 mail_storage_set_error(storage, "INBOX can't be deleted.");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 if (errno == ENOENT) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 mail_storage_set_critical(storage, "unlink_directory(%s) "
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 "failed: %m", index_dir);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 mail_storage_clear_error(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 /* NOTE: renaming INBOX works just fine with us, it's simply created
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 mail_storage_set_error(storage,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 "Target mailbox already exists");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 mail_storage_set_critical(storage, "link(%s, %s) failed: %m",
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 oldpath, newpath);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 (void)rename(old_indexdir, new_indexdir);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 mail_storage_clear_error(storage);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 if (!mbox_is_valid_name(storage, name)) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 *status = MAILBOX_NAME_INVALID;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 if (stat(path, &st) == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 *status = MAILBOX_NAME_EXISTS;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 } else if (errno == ENOENT) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 *status = MAILBOX_NAME_VALID;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 mail_storage_set_critical(storage, "mailbox name status: "
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 "stat(%s) failed: %m", path);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 "mbox", /* name */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 '/', /* hierarchy_sep - can't be changed */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 mbox_create,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 mbox_free,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 mbox_open_mailbox,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 mbox_create_mailbox,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 mbox_delete_mailbox,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 mbox_rename_mailbox,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 mbox_find_mailboxes,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 subsfile_set_subscribed,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 mbox_find_subscribed,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 };
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 NULL, /* name */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 NULL, /* storage */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 index_storage_get_status,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 index_storage_update_flags,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 };