Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/quota/quota-maildir.c @ 8767:e82e0a6b9399 HEAD
Create all mail/index files'/dirs' permissions based on the mailbox directory.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 21 Feb 2009 17:46:35 -0500 |
parents | b9faf4db2a9f |
children | 16c286aee307 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8542
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
2 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
4 #include "array.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
5 #include "ioloop.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
6 #include "nfs-workarounds.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
7 #include "file-dotlock.h" |
8208
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
8 #include "mkdir-parents.h" |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
9 #include "read-full.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
10 #include "write-full.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
11 #include "str.h" |
4351
61cc7e40bec6
Add ",S=size" to maildir filenames when quota plugin is loaded with
Timo Sirainen <tss@iki.fi>
parents:
4330
diff
changeset
|
12 #include "maildir-storage.h" |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
13 #include "quota-private.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
14 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
15 #include <stdio.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
16 #include <stdlib.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
17 #include <dirent.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
18 #include <sys/stat.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
19 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
20 #define MAILDIRSIZE_FILENAME "maildirsize" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
21 #define MAILDIRSIZE_STALE_SECS (60*15) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
22 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
23 struct maildir_quota_root { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
24 struct quota_root root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
25 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
26 const char *maildirsize_path; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
27 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
28 uint64_t total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
29 uint64_t total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
30 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
31 int fd; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
32 time_t recalc_last_stamp; |
7176
d719b373a1aa
Fix to maildirsize reading optimization.
Timo Sirainen <tss@iki.fi>
parents:
7173
diff
changeset
|
33 off_t last_size; |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
34 |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
35 unsigned int limits_initialized:1; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
36 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
37 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
38 struct maildir_list_context { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
39 struct mail_storage *storage; |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
40 struct maildir_quota_root *root; |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
41 struct mailbox_list_iterate_context *iter; |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5770
diff
changeset
|
42 const struct mailbox_info *info; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
43 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
44 string_t *path; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
45 int state; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
46 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
47 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
48 extern struct quota_backend quota_backend_maildir; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
49 |
8027
62cf70991cf2
extern/static fixes (from a sparse check by Diego Liziero)
Timo Sirainen <tss@iki.fi>
parents:
7970
diff
changeset
|
50 static struct dotlock_settings dotlock_settings = { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
51 MEMBER(temp_prefix) NULL, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
52 MEMBER(lock_suffix) NULL, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
53 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
54 MEMBER(timeout) 0, |
6592
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6582
diff
changeset
|
55 MEMBER(stale_timeout) 30 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
56 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
57 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
58 static int maildir_sum_dir(const char *dir, uint64_t *total_bytes, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
59 uint64_t *total_count) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
60 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
61 DIR *dirp; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
62 struct dirent *dp; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
63 string_t *path; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
64 const char *p; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
65 size_t len; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
66 uoff_t num; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
67 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
68 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
69 dirp = opendir(dir); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
70 if (dirp == NULL) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
71 if (errno == ENOENT || errno == ESTALE) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
72 return 0; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
73 i_error("opendir(%s) failed: %m", dir); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
74 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
75 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
76 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
77 path = t_str_new(256); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
78 str_append(path, dir); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
79 str_append_c(path, '/'); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
80 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
81 len = str_len(path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
82 while ((dp = readdir(dirp)) != NULL) { |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
83 if (dp->d_name[0] == '.' && |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
84 (dp->d_name[1] == '\0' || dp->d_name[1] == '.')) |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
85 continue; |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
86 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
87 p = strstr(dp->d_name, ",S="); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
88 num = (uoff_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
89 if (p != NULL) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
90 /* ,S=nnnn[:,] */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
91 p += 3; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
92 for (num = 0; *p >= '0' && *p <= '9'; p++) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
93 num = num * 10 + (*p - '0'); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
94 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
95 if (*p != ':' && *p != '\0' && *p != ',') { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
96 /* not in expected format, fallback to stat() */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
97 num = (uoff_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
98 } else { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
99 *total_bytes += num; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
100 *total_count += 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
101 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
102 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
103 if (num == (uoff_t)-1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
104 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
105 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
106 str_truncate(path, len); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
107 str_append(path, dp->d_name); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
108 if (stat(str_c(path), &st) == 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
109 *total_bytes += st.st_size; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
110 *total_count += 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
111 } else if (errno != ENOENT && errno != ESTALE) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
112 i_error("stat(%s) failed: %m", str_c(path)); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
113 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
114 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
115 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
116 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
117 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
118 if (closedir(dirp) < 0) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
119 i_error("closedir(%s) failed: %m", dir); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
120 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
121 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
122 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
123 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
124 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
125 static struct maildir_list_context * |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
126 maildir_list_init(struct maildir_quota_root *root, |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
127 struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
128 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
129 struct maildir_list_context *ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
130 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
131 ctx = i_new(struct maildir_list_context, 1); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
132 ctx->storage = storage; |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
133 ctx->root = root; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
134 ctx->path = str_new(default_pool, 512); |
4844
a0ba02928787
Bytes and kilobytes were somewhat mixed up everywhere. Also fixes a
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
135 ctx->iter = mailbox_list_iter_init(mail_storage_get_list(storage), "*", |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
136 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
137 return ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
138 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
139 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
140 static const char * |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
141 maildir_list_next(struct maildir_list_context *ctx, time_t *mtime_r) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
142 { |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
143 struct quota_rule *rule; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
144 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
145 bool is_file; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
146 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
147 for (;;) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
148 if (ctx->state == 0) { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
149 ctx->info = mailbox_list_iter_next(ctx->iter); |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
150 if (ctx->info == NULL) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
151 return NULL; |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
152 |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
153 rule = quota_root_rule_find(ctx->root->root.set, |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
154 ctx->info->name); |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
155 if (rule != NULL && rule->ignore) { |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
156 /* mailbox not included in quota */ |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
157 continue; |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
158 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
159 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
160 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
161 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
162 const char *path; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
163 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
164 path = mail_storage_get_mailbox_path(ctx->storage, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
165 ctx->info->name, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
166 &is_file); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
167 str_truncate(ctx->path, 0); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
168 str_append(ctx->path, path); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
169 str_append(ctx->path, ctx->state == 0 ? |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
170 "/new" : "/cur"); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
171 } T_END; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
172 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
173 if (++ctx->state == 2) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
174 ctx->state = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
175 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
176 if (stat(str_c(ctx->path), &st) == 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
177 break; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
178 /* ignore if the directory got lost, stale or if it was |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
179 actually a file and not a directory */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
180 if (errno != ENOENT && errno != ESTALE && errno != ENOTDIR) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
181 i_error("stat(%s) failed: %m", str_c(ctx->path)); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
182 ctx->state = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
183 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
184 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
185 |
8542
4799b4fe4e45
Maildir++ quota: Directory mtimes weren't properly kept track of when recalculating quota.
Timo Sirainen <tss@iki.fi>
parents:
8250
diff
changeset
|
186 *mtime_r = st.st_mtime; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
187 return str_c(ctx->path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
188 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
189 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
190 static int maildir_list_deinit(struct maildir_list_context *ctx) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
191 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
192 int ret = mailbox_list_iter_deinit(&ctx->iter); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
193 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
194 str_free(&ctx->path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
195 i_free(ctx); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
196 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
197 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
198 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
199 static int |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
200 maildirs_check_have_changed(struct maildir_quota_root *root, |
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
201 struct mail_storage *storage, time_t latest_mtime) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
202 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
203 struct maildir_list_context *ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
204 time_t mtime; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
205 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
206 |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
207 ctx = maildir_list_init(root, storage); |
5089 | 208 while (maildir_list_next(ctx, &mtime) != NULL) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
209 if (mtime > latest_mtime) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
210 ret = 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
211 break; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
212 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
213 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
214 if (maildir_list_deinit(ctx) < 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
215 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
216 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
217 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
218 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
219 static int maildirsize_write(struct maildir_quota_root *root, const char *path) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
220 { |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
221 struct quota_root *_root = &root->root; |
8037
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
222 struct mail_storage *const *storages; |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
223 unsigned int i, count; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
224 struct dotlock *dotlock; |
8208
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
225 const char *p, *dir; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
226 string_t *str; |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
227 mode_t mode, dir_mode; |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
228 gid_t gid, dir_gid; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
229 int fd; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
230 |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
231 i_assert(root->fd == -1); |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
232 |
8037
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
233 /* figure out what permissions we should use for maildirsize. |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
234 use the inbox namespace's permissions if possible. */ |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
235 mode = 0600; dir_mode = 0700; |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
236 gid = dir_gid = (gid_t)-1; |
8037
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
237 storages = array_get(&root->root.quota->storages, &count); |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
238 for (i = 0; i < count; i++) { |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
239 if ((storages[i]->ns->flags & NAMESPACE_FLAG_INBOX) != 0) { |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
240 mailbox_list_get_permissions(storages[i]->ns->list, |
8767
e82e0a6b9399
Create all mail/index files'/dirs' permissions based on the mailbox directory.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
241 NULL, &mode, &gid); |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
242 mailbox_list_get_dir_permissions(storages[i]->ns->list, |
8767
e82e0a6b9399
Create all mail/index files'/dirs' permissions based on the mailbox directory.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
243 NULL, |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
244 &dir_mode, &dir_gid); |
8037
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
245 break; |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
246 } |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
247 } |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
248 |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4917
diff
changeset
|
249 dotlock_settings.use_excl_lock = getenv("DOTLOCK_USE_EXCL") != NULL; |
6592
b6631550cf84
dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents:
6582
diff
changeset
|
250 dotlock_settings.nfs_flush = getenv("MAIL_NFS_STORAGE") != NULL; |
8037
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
251 fd = file_dotlock_open_mode(&dotlock_settings, path, |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
252 DOTLOCK_CREATE_FLAG_NONBLOCK, |
ab1c170b1559
Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents:
8029
diff
changeset
|
253 mode, (uid_t)-1, gid, &dotlock); |
8208
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
254 if (fd == -1 && errno == ENOENT) { |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
255 /* the control directory doesn't exist yet? create it */ |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
256 p = strrchr(path, '/'); |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
257 dir = t_strdup_until(path, p); |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
258 if (mkdir_parents(dir, dir_mode) < 0 && errno != EEXIST) { |
8208
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
259 i_error("mkdir_parents(%s) failed: %m", dir); |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
260 return -1; |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
261 } |
8209
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
262 if (dir_gid != (gid_t)-1) { |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
263 if (chown(dir, (uid_t)-1, dir_gid) < 0) { |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
264 i_error("chown(%s,-1,%ld) failed: %m", |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
265 dir, (long)dir_gid); |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
266 } |
329d8757e5c2
Maildir++ quota: Create the missing directory using the correct permissions.
Timo Sirainen <tss@iki.fi>
parents:
8208
diff
changeset
|
267 } |
8208
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
268 fd = file_dotlock_open_mode(&dotlock_settings, path, |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
269 DOTLOCK_CREATE_FLAG_NONBLOCK, |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
270 mode, (uid_t)-1, gid, &dotlock); |
f67d4a0d423b
Maildir++ quota: If directory for maildirsize doesn't exist, create it.
Timo Sirainen <tss@iki.fi>
parents:
8096
diff
changeset
|
271 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
272 if (fd == -1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
273 if (errno == EAGAIN) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
274 /* someone's just in the middle of updating it */ |
5770
213b597e57de
If maildirsize file is being rewritten while we're trying to do that,
Timo Sirainen <tss@iki.fi>
parents:
5704
diff
changeset
|
275 return 1; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
276 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
277 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
278 i_error("file_dotlock_open(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
279 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
280 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
281 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
282 str = t_str_new(128); |
8250
750ca24835c4
Maildir++ quota: If there are no limits, write "0S" as the file header.
Timo Sirainen <tss@iki.fi>
parents:
8246
diff
changeset
|
283 /* if we have no limits, write 0S instead of an empty line */ |
750ca24835c4
Maildir++ quota: If there are no limits, write "0S" as the file header.
Timo Sirainen <tss@iki.fi>
parents:
8246
diff
changeset
|
284 if (_root->bytes_limit != 0 || _root->count_limit == 0) { |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
285 str_printfa(str, "%lluS", |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
286 (unsigned long long)_root->bytes_limit); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
287 } |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
288 if (_root->count_limit != 0) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
289 if (str_len(str) > 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
290 str_append_c(str, ','); |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
291 str_printfa(str, "%lluC", |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
292 (unsigned long long)_root->count_limit); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
293 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
294 str_printfa(str, "\n%llu %llu\n", |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
295 (unsigned long long)root->total_bytes, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
296 (unsigned long long)root->total_count); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
297 if (write_full(fd, str_data(str), str_len(str)) < 0) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
298 i_error("write_full(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
299 file_dotlock_delete(&dotlock); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
300 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
301 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
302 |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
303 /* keep the fd open since we might want to update it later */ |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
304 if (file_dotlock_replace(&dotlock, |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
305 DOTLOCK_REPLACE_FLAG_DONT_CLOSE_FD) < 0) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
306 i_error("file_dotlock_replace(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
307 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
308 } |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
309 root->fd = fd; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
310 return 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
311 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
312 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
313 static void maildirsize_recalculate_init(struct maildir_quota_root *root) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
314 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
315 root->total_bytes = root->total_count = 0; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
316 root->recalc_last_stamp = 0; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
317 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
318 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
319 static int maildirsize_recalculate_storage(struct maildir_quota_root *root, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
320 struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
321 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
322 struct maildir_list_context *ctx; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
323 const char *dir; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
324 time_t mtime; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
325 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
326 |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
327 ctx = maildir_list_init(root, storage); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
328 while ((dir = maildir_list_next(ctx, &mtime)) != NULL) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
329 if (mtime > root->recalc_last_stamp) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
330 root->recalc_last_stamp = mtime; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
331 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
332 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
333 if (maildir_sum_dir(dir, &root->total_bytes, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
334 &root->total_count) < 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
335 ret = -1; |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
336 } T_END; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
337 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
338 if (maildir_list_deinit(ctx) < 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
339 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
340 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
341 return ret; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
342 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
343 |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
344 static void maildirsize_rebuild_later(struct maildir_quota_root *root) |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
345 { |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
346 if (!root->root.set->force_default_rule) { |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
347 /* FIXME: can't unlink(), because the limits would be lost. */ |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
348 return; |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
349 } |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
350 |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
351 if (unlink(root->maildirsize_path) < 0 && |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
352 errno != ENOENT && errno != ESTALE) |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
353 i_error("unlink(%s) failed: %m", root->maildirsize_path); |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
354 } |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
355 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
356 static int maildirsize_recalculate_finish(struct maildir_quota_root *root, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
357 int ret) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
358 { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
359 if (ret == 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
360 /* maildir didn't change, we can write the maildirsize file */ |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
361 ret = maildirsize_write(root, root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
362 } |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
363 if (ret != 0) |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
364 maildirsize_rebuild_later(root); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
365 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
366 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
367 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
368 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
369 static int maildirsize_recalculate(struct maildir_quota_root *root) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
370 { |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
371 struct mail_storage *const *storages; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
372 unsigned int i, count; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
373 int ret = 0; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
374 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
375 maildirsize_recalculate_init(root); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
376 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
377 /* count mails from all storages */ |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
378 storages = array_get(&root->root.quota->storages, &count); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
379 for (i = 0; i < count; i++) { |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
380 if (maildirsize_recalculate_storage(root, storages[i]) < 0) { |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
381 ret = -1; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
382 break; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
383 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
384 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
385 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
386 if (ret == 0) { |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
387 /* check if any of the directories have changed */ |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
388 for (i = 0; i < count; i++) { |
7470
73368107aeda
Added "ignore" option to quota rules which causes the mailbox to be ignored
Timo Sirainen <tss@iki.fi>
parents:
7364
diff
changeset
|
389 ret = maildirs_check_have_changed(root, storages[i], |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
390 root->recalc_last_stamp); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
391 if (ret != 0) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
392 break; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
393 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
394 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
395 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
396 return maildirsize_recalculate_finish(root, ret); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
397 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
398 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
399 static bool |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
400 maildir_parse_limit(const char *str, uint64_t *bytes_r, uint64_t *count_r) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
401 { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
402 const char *const *limit; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
403 unsigned long long value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
404 char *pos; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
405 bool ret = TRUE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
406 |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
407 *bytes_r = 0; |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
408 *count_r = 0; |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
409 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
410 /* 0 values mean unlimited */ |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
411 for (limit = t_strsplit(str, ","); *limit != NULL; limit++) { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
412 value = strtoull(*limit, &pos, 10); |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
413 if (pos[0] != '\0' && pos[1] == '\0') { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
414 switch (pos[0]) { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
415 case 'C': |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
416 if (value != 0) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
417 *count_r = value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
418 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
419 case 'S': |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
420 if (value != 0) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
421 *bytes_r = value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
422 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
423 default: |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
424 ret = FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
425 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
426 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
427 } else { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
428 ret = FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
429 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
430 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
431 return ret; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
432 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
433 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
434 static int maildirsize_parse(struct maildir_quota_root *root, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
435 int fd, const char *const *lines) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
436 { |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
437 struct quota_root *_root = &root->root; |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
438 uint64_t message_bytes_limit, message_count_limit; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
439 long long bytes_diff, total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
440 int count_diff, total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
441 unsigned int line_count = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
442 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
443 if (*lines == NULL) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
444 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
445 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
446 /* first line contains the limits */ |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
447 (void)maildir_parse_limit(lines[0], &message_bytes_limit, |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
448 &message_count_limit); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
449 |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
450 /* truncate too high limits to signed 64bit int range */ |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
451 if (message_bytes_limit >= (1ULL << 63)) |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
452 message_bytes_limit = (1ULL << 63) - 1; |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
453 if (message_count_limit >= (1ULL << 63)) |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
454 message_count_limit = (1ULL << 63) - 1; |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
455 |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
456 if (root->root.bytes_limit == (int64_t)message_bytes_limit && |
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
457 root->root.count_limit == (int64_t)message_count_limit) { |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
458 /* limits haven't changed */ |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
459 } else if (root->root.set->force_default_rule) { |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
460 /* we know the limits and they've changed. |
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
461 the file must be rewritten. */ |
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
462 return 0; |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
463 } else { |
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
464 /* we're using limits from the file. */ |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
465 root->root.bytes_limit = message_bytes_limit; |
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
466 root->root.count_limit = message_count_limit; |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
467 quota_root_recalculate_relative_rules(root->root.set); |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
468 } |
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
469 |
5293
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
470 if (*lines == NULL) { |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
471 /* no quota lines. rebuild it. */ |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
472 return 0; |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
473 } |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
474 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
475 /* rest of the lines contains <bytes> <count> diffs */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
476 total_bytes = 0; total_count = 0; |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
477 for (lines++; *lines != NULL; lines++, line_count++) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
478 if (sscanf(*lines, "%lld %d", &bytes_diff, &count_diff) != 2) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
479 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
480 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
481 total_bytes += bytes_diff; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
482 total_count += count_diff; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
483 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
484 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
485 if (total_bytes < 0 || total_count < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
486 /* corrupted */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
487 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
488 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
489 |
8096
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
490 if ((total_bytes > _root->bytes_limit && _root->bytes_limit != 0) || |
f35a8a3dc06d
Fixed FS quota compiling and Maildir++ quota with multiple users.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
491 (total_count > _root->count_limit && _root->count_limit != 0)) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
492 /* we're over quota. don't trust these values if the file |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
493 contains more than the initial summary line, or if the file |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
494 is older than 15 minutes. */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
495 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
496 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
497 if (line_count > 1) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
498 return 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
499 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
500 if (fstat(fd, &st) < 0 || |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
501 st.st_mtime < ioloop_time - MAILDIRSIZE_STALE_SECS) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
502 return 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
503 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
504 root->total_bytes = (uint64_t)total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
505 root->total_count = (uint64_t)total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
506 return 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
507 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
508 |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
509 static int maildirsize_open(struct maildir_quota_root *root) |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
510 { |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
511 if (root->fd != -1) { |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
512 if (close(root->fd) < 0) |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
513 i_error("close(%s) failed: %m", root->maildirsize_path); |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
514 } |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
515 |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
516 root->fd = nfs_safe_open(root->maildirsize_path, O_RDWR | O_APPEND); |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
517 if (root->fd == -1) { |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
518 if (errno == ENOENT) |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
519 return 0; |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
520 i_error("open(%s) failed: %m", root->maildirsize_path); |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
521 return -1; |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
522 } |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
523 return 1; |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
524 } |
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
525 |
7173
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
526 static bool maildirsize_has_changed(struct maildir_quota_root *root) |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
527 { |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
528 struct stat st1, st2; |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
529 |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
530 if (dotlock_settings.nfs_flush) { |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
531 nfs_flush_file_handle_cache(root->maildirsize_path); |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
532 nfs_flush_attr_cache_unlocked(root->maildirsize_path); |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
533 } |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
534 |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
535 if (root->fd == -1) |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
536 return TRUE; |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
537 |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
538 if (stat(root->maildirsize_path, &st1) < 0) |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
539 return TRUE; |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
540 if (fstat(root->fd, &st2) < 0) |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
541 return TRUE; |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
542 |
7176
d719b373a1aa
Fix to maildirsize reading optimization.
Timo Sirainen <tss@iki.fi>
parents:
7173
diff
changeset
|
543 return root->last_size != st2.st_size || st1.st_ino != st2.st_ino || |
7173
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
544 !CMP_DEV_T(st1.st_dev, st2.st_dev); |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
545 } |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
546 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
547 static int maildirsize_read(struct maildir_quota_root *root) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
548 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
549 char buf[5120+1]; |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
550 unsigned int i, size; |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
551 int ret; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
552 |
7173
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
553 if (!maildirsize_has_changed(root)) |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
554 return 1; |
9841a8563116
Don't re-read maildirsize if it hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
7172
diff
changeset
|
555 |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
556 if ((ret = maildirsize_open(root)) <= 0) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
557 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
558 |
4218
a3f9089faadb
Fixed a buffer overflow if maildirsize was over 5120 bytes long. Luckily
Timo Sirainen <tss@iki.fi>
parents:
4215
diff
changeset
|
559 /* @UNSAFE */ |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
560 size = 0; |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
561 while ((ret = read(root->fd, buf + size, sizeof(buf)-1 - size)) != 0) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
562 if (ret < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
563 if (errno == ESTALE) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
564 break; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
565 i_error("read(%s) failed: %m", root->maildirsize_path); |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
566 break; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
567 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
568 size += ret; |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
569 if (size >= sizeof(buf)-1) { |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
570 /* we'll need to recalculate the quota */ |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
571 break; |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
572 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
573 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
574 |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
575 /* try to use the file even if we ran into some error. if we don't have |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
576 forced limits, we'll need to read the header to get them */ |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
577 root->total_bytes = root->total_count = 0; |
7176
d719b373a1aa
Fix to maildirsize reading optimization.
Timo Sirainen <tss@iki.fi>
parents:
7173
diff
changeset
|
578 root->last_size = size; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
579 |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
580 /* skip the last line if there's no LF at the end. Remove the last LF |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
581 so we don't get one empty line in the strsplit. */ |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
582 while (size > 0 && buf[size-1] != '\n') size--; |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
583 if (size > 0) size--; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
584 buf[size] = '\0'; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
585 |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
586 if (ret < 0 && size == 0) { |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
587 /* the read failed and there's no usable header, fail. */ |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
588 (void)close(root->fd); |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
589 root->fd = -1; |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
590 return -1; |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
591 } |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
592 |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
593 /* If there are any NUL bytes, the file is broken. */ |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
594 for (i = 0; i < size; i++) { |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
595 if (buf[i] == '\0') |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
596 break; |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
597 } |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
598 |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
599 if (i == size && |
8246
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
600 maildirsize_parse(root, root->fd, t_strsplit(buf, "\n")) > 0 && |
8e5fd70ea3be
Maildir++ quota: Fixed maildirsize recalculation when quota limits were read from the file.
Timo Sirainen <tss@iki.fi>
parents:
8245
diff
changeset
|
601 ret == 0) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
602 ret = 1; |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
603 else { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
604 /* broken file / need recalculation */ |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
605 (void)close(root->fd); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
606 root->fd = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
607 ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
608 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
609 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
610 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
611 |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
612 static bool maildirquota_limits_init(struct maildir_quota_root *root) |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
613 { |
7295
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
614 if (!root->limits_initialized) { |
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
615 root->limits_initialized = TRUE; |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
616 |
7295
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
617 if (root->maildirsize_path == NULL) { |
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
618 i_warning("quota maildir: No maildir storages, " |
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
619 "ignoring quota."); |
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
620 } |
a39b16b0a530
quota_rule=?:.. specifies the default quota limits to use when backend
Timo Sirainen <tss@iki.fi>
parents:
7294
diff
changeset
|
621 } |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
622 |
6996
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
623 return root->maildirsize_path != NULL; |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
624 } |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
625 |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
626 static int maildirquota_refresh(struct maildir_quota_root *root) |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
627 { |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
628 int ret; |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
629 |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
630 if (!maildirquota_limits_init(root)) |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
631 return 0; |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
632 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
633 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
634 ret = maildirsize_read(root); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7176
diff
changeset
|
635 } T_END; |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
636 if (ret == 0) { |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
637 if (root->root.set->default_rule.bytes_limit == 0 && |
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
638 root->root.set->default_rule.count_limit == 0) { |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
639 /* no quota */ |
8245
2b39142e6430
Maildir++ quota: If there'a s "*" quota rule with 0 limits, keep the quota up-to-date anyway.
Timo Sirainen <tss@iki.fi>
parents:
8209
diff
changeset
|
640 if (!root->root.set->force_default_rule) |
2b39142e6430
Maildir++ quota: If there'a s "*" quota rule with 0 limits, keep the quota up-to-date anyway.
Timo Sirainen <tss@iki.fi>
parents:
8209
diff
changeset
|
641 return 0; |
2b39142e6430
Maildir++ quota: If there'a s "*" quota rule with 0 limits, keep the quota up-to-date anyway.
Timo Sirainen <tss@iki.fi>
parents:
8209
diff
changeset
|
642 /* explicitly specified 0 as quota. keep the quota |
2b39142e6430
Maildir++ quota: If there'a s "*" quota rule with 0 limits, keep the quota up-to-date anyway.
Timo Sirainen <tss@iki.fi>
parents:
8209
diff
changeset
|
643 updated even if it's not enforced. */ |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
644 } |
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
645 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
646 ret = maildirsize_recalculate(root); |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
647 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
648 return ret < 0 ? -1 : 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
649 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
650 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
651 static int maildirsize_update(struct maildir_quota_root *root, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
652 int count_diff, int64_t bytes_diff) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
653 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
654 char str[MAX_INT_STRLEN*2 + 2]; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
655 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
656 |
4093
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
657 if (count_diff == 0 && bytes_diff == 0) |
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
658 return 0; |
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
659 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
660 /* We rely on O_APPEND working in here. That isn't NFS-safe, but it |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
661 isn't necessarily that bad because the file is recreated once in |
5219 | 662 a while, and sooner if corruption causes calculations to go |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
663 over quota. This is also how Maildir++ spec specifies it should be |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
664 done.. */ |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
665 i_snprintf(str, sizeof(str), "%lld %d\n", |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6847
diff
changeset
|
666 (long long)bytes_diff, count_diff); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
667 if (write_full(root->fd, str, strlen(str)) < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
668 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
669 if (errno == ESTALE) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
670 /* deleted/replaced already, ignore */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
671 } else { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
672 i_error("write_full(%s) failed: %m", |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
673 root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
674 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
675 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
676 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
677 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
678 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
679 static struct quota_root *maildir_quota_alloc(void) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
680 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
681 struct maildir_quota_root *root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
682 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
683 root = i_new(struct maildir_quota_root, 1); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
684 root->fd = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
685 return &root->root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
686 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
687 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
688 static void maildir_quota_deinit(struct quota_root *_root) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
689 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
690 struct maildir_quota_root *root = (struct maildir_quota_root *)_root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
691 |
4917
5d00d8a7888e
Fixed a file descriptor at deinit.
Timo Sirainen <tss@iki.fi>
parents:
4844
diff
changeset
|
692 if (root->fd != -1) |
5d00d8a7888e
Fixed a file descriptor at deinit.
Timo Sirainen <tss@iki.fi>
parents:
4844
diff
changeset
|
693 (void)close(root->fd); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
694 i_free(root); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
695 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
696 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
697 static bool |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8037
diff
changeset
|
698 maildir_quota_parse_rule(struct quota_root_settings *root_set ATTR_UNUSED, |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
699 struct quota_rule *rule, |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
700 const char *str, const char **error_r) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
701 { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
702 uint64_t bytes, count; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
703 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
704 if (!maildir_parse_limit(str, &bytes, &count)) { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
705 *error_r = "Invalid Maildir++ quota rule"; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
706 return FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
707 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
708 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
709 rule->bytes_limit = bytes; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
710 rule->count_limit = count; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
711 return TRUE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
712 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
713 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
714 static void |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
715 maildir_quota_root_storage_added(struct quota_root *_root, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
716 struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
717 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
718 struct maildir_quota_root *root = (struct maildir_quota_root *)_root; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
719 const char *control_dir; |
4351
61cc7e40bec6
Add ",S=size" to maildir filenames when quota plugin is loaded with
Timo Sirainen <tss@iki.fi>
parents:
4330
diff
changeset
|
720 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
721 if (root->maildirsize_path != NULL) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
722 return; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
723 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
724 control_dir = mail_storage_get_mailbox_control_dir(storage, ""); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
725 root->maildirsize_path = |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
726 p_strconcat(_root->pool, control_dir, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
727 "/"MAILDIRSIZE_FILENAME, NULL); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
728 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
729 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
730 static void |
7970
bc5a85e2b11d
maildir: Add ,S=<size> to maildir filename with all quota backends.
Timo Sirainen <tss@iki.fi>
parents:
7476
diff
changeset
|
731 maildir_quota_storage_added(struct quota *quota, struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
732 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
733 struct quota_root **roots; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
734 unsigned int i, count; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
735 |
7970
bc5a85e2b11d
maildir: Add ,S=<size> to maildir filename with all quota backends.
Timo Sirainen <tss@iki.fi>
parents:
7476
diff
changeset
|
736 if (strcmp(storage->name, "maildir") != 0) |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
737 return; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
738 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
739 roots = array_get_modifiable("a->roots, &count); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
740 for (i = 0; i < count; i++) { |
4514
511f1f5c76fa
Changes to make trash plugin working again.
Timo Sirainen <tss@iki.fi>
parents:
4509
diff
changeset
|
741 if (roots[i]->backend.name == quota_backend_maildir.name) |
7970
bc5a85e2b11d
maildir: Add ,S=<size> to maildir filename with all quota backends.
Timo Sirainen <tss@iki.fi>
parents:
7476
diff
changeset
|
742 maildir_quota_root_storage_added(roots[i], storage); |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
743 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
744 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
745 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
746 static const char *const * |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
747 maildir_quota_root_get_resources(struct quota_root *root ATTR_UNUSED) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
748 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
749 static const char *resources_both[] = { |
4844
a0ba02928787
Bytes and kilobytes were somewhat mixed up everywhere. Also fixes a
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
750 QUOTA_NAME_STORAGE_KILOBYTES, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
751 QUOTA_NAME_MESSAGES, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
752 NULL |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
753 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
754 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
755 return resources_both; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
756 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
757 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
758 static int |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
759 maildir_quota_get_resource(struct quota_root *_root, const char *name, |
7294
9e4c26471b19
Relative (%) limits in quota rules and warnings work now if the backend
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
760 uint64_t *value_r) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
761 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
762 struct maildir_quota_root *root = (struct maildir_quota_root *)_root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
763 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
764 if (maildirquota_refresh(root) < 0) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
765 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
766 |
7172
097fe25ab218
If quota limits weren't specified, they should have been taken from
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
767 if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) { |
4844
a0ba02928787
Bytes and kilobytes were somewhat mixed up everywhere. Also fixes a
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
768 *value_r = root->total_bytes; |
7172
097fe25ab218
If quota limits weren't specified, they should have been taken from
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
769 } else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
770 *value_r = root->total_count; |
7172
097fe25ab218
If quota limits weren't specified, they should have been taken from
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
771 } else |
4134
8a61b892bd60
Fixes. Added storage and messages parameters to quota plugin parameter. If given, they specify the master quota limits, so if maildirsize has different limits Dovecot will replace them. If maildirsize doesn't exist and Dovecot doesn't have limits, Maildir++ quota is disabled for the user.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4133
diff
changeset
|
772 return 0; |
4133
80eeec535031
Return value of get_resource() was wrong, which caused quota reporting not
Timo Sirainen <tss@iki.fi>
parents:
4093
diff
changeset
|
773 return 1; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
774 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
775 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
776 static int |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
777 maildir_quota_update(struct quota_root *_root, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
778 struct quota_transaction_context *ctx) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
779 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
780 struct maildir_quota_root *root = |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
781 (struct maildir_quota_root *) _root; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
782 |
6996
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
783 if (!maildirquota_limits_init(root)) { |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
784 /* no limits */ |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
785 return 0; |
021b6900a900
Check if we have maildir quota storages at all before trying to expunge
Timo Sirainen <tss@iki.fi>
parents:
6995
diff
changeset
|
786 } |
7476
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
787 |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
788 /* even though we don't really care about the limits in here ourself, |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
789 we do want to make sure the header gets updated if the limits have |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
790 changed. also this makes sure the maildirsize file is created if |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
791 it doesn't exist. */ |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
792 if (maildirquota_refresh(root) < 0) |
2475c57fadb0
When updating maildir quota create also missing maildirsize file and make
Timo Sirainen <tss@iki.fi>
parents:
7470
diff
changeset
|
793 return -1; |
6995
2e9fcf711fc4
Expunging messages didn't update maildirsize file if it wasn't already
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
794 |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
795 if (root->fd == -1 || ctx->recalculate || |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
796 maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0) |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
797 maildirsize_rebuild_later(root); |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
798 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
799 return 0; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
800 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
801 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
802 struct quota_backend quota_backend_maildir = { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
803 "maildir", |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
804 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
805 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
806 maildir_quota_alloc, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
807 NULL, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
808 maildir_quota_deinit, |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
809 maildir_quota_parse_rule, |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
810 maildir_quota_storage_added, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
811 maildir_quota_root_get_resources, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
812 maildir_quota_get_resource, |
8029
796307638449
FS quota: Handle quota only for the quota roots which apply to the mailbox
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
813 maildir_quota_update, |
796307638449
FS quota: Handle quota only for the quota roots which apply to the mailbox
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
814 NULL |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
815 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
816 }; |