Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/quota/quota-maildir.c @ 6411:6a64e64fa3a3 HEAD
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 16 Sep 2007 11:40:56 +0300 |
parents | 1d73153584d2 |
children | 65c69a53a7be |
rev | line source |
---|---|
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2006 Timo Sirainen */ |
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" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
8 #include "read-full.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
9 #include "write-full.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
10 #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
|
11 #include "maildir-storage.h" |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
12 #include "quota-private.h" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
13 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
14 #include <stdio.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
15 #include <stdlib.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
16 #include <dirent.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
17 #include <sys/stat.h> |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
18 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
19 #define MAILDIRSIZE_FILENAME "maildirsize" |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
20 #define MAILDIRSIZE_STALE_SECS (60*15) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
21 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
22 struct maildir_quota_root { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
23 struct quota_root root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
24 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
25 const char *maildirsize_path; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
26 uint64_t message_bytes_limit; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
27 uint64_t message_count_limit; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
28 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
29 uint64_t total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
30 uint64_t total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
31 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
32 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
|
33 time_t recalc_last_stamp; |
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; |
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
|
36 unsigned int master_message_limits:1; |
4086
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 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
39 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
|
40 struct mail_storage *storage; |
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 |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4917
diff
changeset
|
50 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, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
55 MEMBER(stale_timeout) 30, |
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 MEMBER(callback) NULL, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
58 MEMBER(context) NULL, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
59 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
60 MEMBER(use_excl_lock) FALSE |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
61 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
62 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
63 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
|
64 uint64_t *total_count) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
65 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
66 DIR *dirp; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
67 struct dirent *dp; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
68 string_t *path; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
69 const char *p; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
70 size_t len; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
71 uoff_t num; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
72 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
73 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
74 dirp = opendir(dir); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
75 if (dirp == NULL) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
76 if (errno == ENOENT || errno == ESTALE) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
77 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
|
78 i_error("opendir(%s) failed: %m", dir); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
79 return -1; |
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 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
82 path = t_str_new(256); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
83 str_append(path, dir); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
84 str_append_c(path, '/'); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
85 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
86 len = str_len(path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
87 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
|
88 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
|
89 (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
|
90 continue; |
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
91 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
92 p = strstr(dp->d_name, ",S="); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
93 num = (uoff_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
94 if (p != NULL) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
95 /* ,S=nnnn[:,] */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
96 p += 3; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
97 for (num = 0; *p >= '0' && *p <= '9'; p++) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
98 num = num * 10 + (*p - '0'); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
99 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
100 if (*p != ':' && *p != '\0' && *p != ',') { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
101 /* not in expected format, fallback to stat() */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
102 num = (uoff_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
103 } else { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
104 *total_bytes += num; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
105 *total_count += 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
106 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
107 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
108 if (num == (uoff_t)-1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
109 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
110 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
111 str_truncate(path, len); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
112 str_append(path, dp->d_name); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
113 if (stat(str_c(path), &st) == 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
114 *total_bytes += st.st_size; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
115 *total_count += 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
116 } 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
|
117 i_error("stat(%s) failed: %m", str_c(path)); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
118 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
119 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
120 } |
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 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
123 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
|
124 i_error("closedir(%s) failed: %m", dir); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
125 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
126 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
127 return ret; |
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 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
130 static struct maildir_list_context * |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
131 maildir_list_init(struct mail_storage *storage) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
132 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
133 struct maildir_list_context *ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
134 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
135 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
|
136 ctx->storage = storage; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
137 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
|
138 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
|
139 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
140 return ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
141 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
142 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
143 static const char * |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
144 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
|
145 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
146 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
147 const char *path; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
148 bool is_file; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
149 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
150 for (;;) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
151 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
|
152 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
|
153 if (ctx->info == NULL) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
154 return NULL; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
155 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
156 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
157 t_push(); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
158 path = mail_storage_get_mailbox_path(ctx->storage, |
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
159 ctx->info->name, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
160 &is_file); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
161 str_truncate(ctx->path, 0); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
162 str_append(ctx->path, path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
163 str_append(ctx->path, ctx->state == 0 ? "/new" : "/cur"); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
164 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
165 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
166 if (++ctx->state == 2) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
167 ctx->state = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
168 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
169 if (stat(str_c(ctx->path), &st) == 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
170 break; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
171 /* ignore if the directory got lost, stale or if it was |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
172 actually a file and not a directory */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
173 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
|
174 i_error("stat(%s) failed: %m", str_c(ctx->path)); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
175 ctx->state = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
176 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
177 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
178 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
179 *mtime_r = st.st_size; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
180 return str_c(ctx->path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
181 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
182 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
183 static int maildir_list_deinit(struct maildir_list_context *ctx) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
184 { |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4801
diff
changeset
|
185 int ret = mailbox_list_iter_deinit(&ctx->iter); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
186 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
187 str_free(&ctx->path); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
188 i_free(ctx); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
189 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
190 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
191 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
192 static int |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
193 maildirs_check_have_changed(struct mail_storage *storage, time_t latest_mtime) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
194 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
195 struct maildir_list_context *ctx; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
196 time_t mtime; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
197 int ret = 0; |
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 ctx = maildir_list_init(storage); |
5089 | 200 while (maildir_list_next(ctx, &mtime) != NULL) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
201 if (mtime > latest_mtime) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
202 ret = 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
203 break; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
204 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
205 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
206 if (maildir_list_deinit(ctx) < 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
207 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
208 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
209 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
210 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
211 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
|
212 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
213 struct dotlock *dotlock; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
214 string_t *str; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
215 int fd; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
216 |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
217 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
|
218 |
4968
1baf9dd3fc40
Added dotlock_use_excl setting.
Timo Sirainen <tss@iki.fi>
parents:
4917
diff
changeset
|
219 dotlock_settings.use_excl_lock = getenv("DOTLOCK_USE_EXCL") != NULL; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
220 fd = file_dotlock_open(&dotlock_settings, path, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
221 DOTLOCK_CREATE_FLAG_NONBLOCK, &dotlock); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
222 if (fd == -1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
223 if (errno == EAGAIN) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
224 /* 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
|
225 return 1; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
226 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
227 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
228 i_error("file_dotlock_open(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
229 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
230 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
231 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
232 str = t_str_new(128); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
233 if (root->message_bytes_limit != (uint64_t)-1) { |
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
|
234 str_printfa(str, "%lluS", |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
235 (unsigned long long)root->message_bytes_limit); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
236 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
237 if (root->message_count_limit != (uint64_t)-1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
238 if (str_len(str) > 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
239 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
|
240 str_printfa(str, "%lluC", |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
241 (unsigned long long)root->message_count_limit); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
242 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
243 str_printfa(str, "\n%llu %llu\n", |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
244 (unsigned long long)root->total_bytes, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
245 (unsigned long long)root->total_count); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
246 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
|
247 i_error("write_full(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
248 file_dotlock_delete(&dotlock); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
249 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
250 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
251 |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
252 /* 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
|
253 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
|
254 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
|
255 i_error("file_dotlock_replace(%s) failed: %m", path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
256 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
257 } |
4508
807217630d80
Don't count "." and ".." directory sizes to quota. After rewriting
Timo Sirainen <tss@iki.fi>
parents:
4351
diff
changeset
|
258 root->fd = fd; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
259 return 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
260 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
261 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
262 static void maildirsize_recalculate_init(struct maildir_quota_root *root) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
263 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
264 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
|
265 root->recalc_last_stamp = 0; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
266 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
267 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
268 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
|
269 struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
270 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
271 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
|
272 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
|
273 time_t mtime; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
274 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
275 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
276 ctx = maildir_list_init(storage); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
277 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
|
278 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
|
279 root->recalc_last_stamp = mtime; |
4086
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 t_push(); |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
282 if (maildir_sum_dir(dir, &root->total_bytes, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
283 &root->total_count) < 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
284 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
285 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
286 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
287 if (maildir_list_deinit(ctx) < 0) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
288 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
289 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
290 return ret; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
291 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
292 |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
293 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
|
294 { |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
295 if (!root->master_message_limits) { |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
296 /* 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
|
297 return; |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
298 } |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
299 |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 } |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
304 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
305 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
|
306 int ret) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
307 { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
308 if (ret == 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
309 /* 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
|
310 ret = maildirsize_write(root, root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
311 } |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
312 if (ret != 0) |
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
313 maildirsize_rebuild_later(root); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
314 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
315 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
316 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
317 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
318 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
|
319 { |
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 *const *storages; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
321 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
|
322 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
|
323 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
324 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
|
325 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
326 /* 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
|
327 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
|
328 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
|
329 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
|
330 ret = -1; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
331 break; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
332 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
333 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
334 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
335 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
|
336 /* 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
|
337 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
|
338 ret = maildirs_check_have_changed(storages[i], |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
339 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
|
340 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
|
341 break; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
342 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
343 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
344 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
345 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
|
346 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
347 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
348 static bool |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
349 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
|
350 { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
351 const char *const *limit; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
352 unsigned long long value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
353 char *pos; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
354 bool ret = TRUE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
355 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
356 *bytes_r = (uint64_t)-1; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
357 *count_r = (uint64_t)-1; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
358 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
359 /* 0 values mean unlimited */ |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
360 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
|
361 value = strtoull(*limit, &pos, 10); |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
362 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
|
363 switch (pos[0]) { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
364 case 'C': |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
365 if (value != 0) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
366 *count_r = value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
367 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
368 case 'S': |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
369 if (value != 0) |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
370 *bytes_r = value; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
371 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
372 default: |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
373 ret = FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
374 break; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
375 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
376 } else { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
377 ret = FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
378 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
379 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
380 return ret; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
381 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
382 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
383 static int maildirsize_parse(struct maildir_quota_root *root, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
384 int fd, const char *const *lines) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
385 { |
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
|
386 uint64_t message_bytes_limit, message_count_limit; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
387 long long bytes_diff, total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
388 int count_diff, total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
389 unsigned int line_count = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
390 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
391 if (*lines == NULL) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
392 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
393 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
394 /* first line contains the limits */ |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
395 (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
|
396 &message_count_limit); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
397 |
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
|
398 if (!root->master_message_limits) { |
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
|
399 /* we don't know the limits, use whatever the file says */ |
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
|
400 root->message_bytes_limit = message_bytes_limit; |
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
|
401 root->message_count_limit = message_count_limit; |
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
|
402 } else if (root->message_bytes_limit != message_bytes_limit || |
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
|
403 root->message_count_limit != message_count_limit) { |
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
|
404 /* 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
|
405 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
|
406 return 0; |
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
|
407 } |
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
|
408 |
5293
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
409 if (*lines == NULL) { |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
410 /* 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
|
411 return 0; |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
412 } |
5252f735e67f
If maildirsize file contains only the header, recalculate the quota.
Timo Sirainen <tss@iki.fi>
parents:
5219
diff
changeset
|
413 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
414 /* rest of the lines contains <bytes> <count> diffs */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
415 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
|
416 for (lines++; *lines != NULL; lines++, line_count++) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
417 if (sscanf(*lines, "%lld %d", &bytes_diff, &count_diff) != 2) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
418 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
419 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
420 total_bytes += bytes_diff; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
421 total_count += count_diff; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
422 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
423 /* we end always with LF, which shows up as empty last line. there |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
424 should be no other empty lines */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
425 if (lines[1] != NULL) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
426 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
427 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
428 if (total_bytes < 0 || total_count < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
429 /* corrupted */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
430 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
431 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
432 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
433 if ((uint64_t)total_bytes > root->message_bytes_limit || |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
434 (uint64_t)total_count > root->message_count_limit) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
435 /* 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
|
436 contains more than the initial summary line, or if the file |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
437 is older than 15 minutes. */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
438 struct stat st; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
439 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
440 if (line_count > 1) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
441 return 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 (fstat(fd, &st) < 0 || |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
444 st.st_mtime < ioloop_time - MAILDIRSIZE_STALE_SECS) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
445 return 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
446 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
447 root->total_bytes = (uint64_t)total_bytes; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
448 root->total_count = (uint64_t)total_count; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
449 return 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
450 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
451 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
452 static int maildirsize_read(struct maildir_quota_root *root) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
453 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
454 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
|
455 unsigned int i, size; |
4801
53b73f19a652
Fixed some warnings with older gccs.
Timo Sirainen <tss@iki.fi>
parents:
4514
diff
changeset
|
456 int fd, ret = 0; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
457 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
458 t_push(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
459 if (root->fd != -1) { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
460 if (close(root->fd) < 0) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
461 i_error("close(%s) failed: %m", root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
462 root->fd = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
463 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
464 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
465 fd = nfs_safe_open(root->maildirsize_path, O_RDWR | O_APPEND); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
466 if (fd == -1) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
467 if (errno == ENOENT) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
468 ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
469 else { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
470 ret = -1; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
471 i_error("open(%s) failed: %m", root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
472 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
473 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
474 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
475 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
476 |
4218
a3f9089faadb
Fixed a buffer overflow if maildirsize was over 5120 bytes long. Luckily
Timo Sirainen <tss@iki.fi>
parents:
4215
diff
changeset
|
477 /* @UNSAFE */ |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
478 size = 0; |
4218
a3f9089faadb
Fixed a buffer overflow if maildirsize was over 5120 bytes long. Luckily
Timo Sirainen <tss@iki.fi>
parents:
4215
diff
changeset
|
479 while (size < sizeof(buf)-1 && |
a3f9089faadb
Fixed a buffer overflow if maildirsize was over 5120 bytes long. Luckily
Timo Sirainen <tss@iki.fi>
parents:
4215
diff
changeset
|
480 (ret = read(fd, buf + size, sizeof(buf)-1 - size)) != 0) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
481 if (ret < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
482 if (errno == ESTALE) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
483 break; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
484 i_error("read(%s) failed: %m", root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
485 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
486 size += ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
487 } |
4218
a3f9089faadb
Fixed a buffer overflow if maildirsize was over 5120 bytes long. Luckily
Timo Sirainen <tss@iki.fi>
parents:
4215
diff
changeset
|
488 if (ret < 0 || size >= sizeof(buf)-1) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
489 /* error / recalculation needed. */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
490 (void)close(fd); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
491 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
492 return ret < 0 ? -1 : 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
493 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
494 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
495 /* file is smaller than 5120 bytes, which means we can use it */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
496 root->total_bytes = root->total_count = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
497 |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
498 /* 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
|
499 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
|
500 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
|
501 if (size > 0) size--; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
502 buf[size] = '\0'; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
503 |
5218
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
504 /* 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
|
505 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
|
506 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
|
507 break; |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
508 } |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
509 |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
510 if (i == size && |
940b9849057b
If maildirsize contained NUL bytes at the beginning of the line (could
Timo Sirainen <tss@iki.fi>
parents:
5161
diff
changeset
|
511 maildirsize_parse(root, fd, t_strsplit(buf, "\n")) > 0) { |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
512 root->fd = fd; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
513 ret = 1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
514 } else { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
515 /* broken file / need recalculation */ |
5070 | 516 (void)close(fd); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
517 root->fd = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
518 ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
519 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
520 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
521 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
522 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
523 |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
524 static void maildirquota_init_limits(struct maildir_quota_root *root) |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
525 { |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
526 root->limits_initialized = TRUE; |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
527 |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
528 if (root->root.default_rule.bytes_limit != 0 || |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
529 root->root.default_rule.count_limit != 0) { |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
530 root->master_message_limits = TRUE; |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
531 root->message_bytes_limit = root->root.default_rule.bytes_limit; |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
532 root->message_count_limit = root->root.default_rule.count_limit; |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
533 } |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
534 } |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
535 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
536 static int maildirquota_refresh(struct maildir_quota_root *root) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
537 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
538 int ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
539 |
5161
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
540 if (!root->limits_initialized) |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
541 maildirquota_init_limits(root); |
e0ec43583be5
We were relying on the limits in maildirsize file instead of using the
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
542 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
543 ret = maildirsize_read(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
|
544 if (ret == 0) { |
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
|
545 if (root->message_bytes_limit == (uint64_t)-1 && |
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
|
546 root->message_count_limit == (uint64_t)-1) { |
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
|
547 /* no quota */ |
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
|
548 return 0; |
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
|
549 } |
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
|
550 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
551 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
|
552 } |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
553 return ret < 0 ? -1 : 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
554 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
555 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
556 static int maildirsize_update(struct maildir_quota_root *root, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
557 int count_diff, int64_t bytes_diff) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
558 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
559 const char *str; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
560 int ret = 0; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
561 |
4093
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
562 if (count_diff == 0 && bytes_diff == 0) |
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
563 return 0; |
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
564 |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
565 t_push(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
566 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
567 /* 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
|
568 isn't necessarily that bad because the file is recreated once in |
5219 | 569 a while, and sooner if corruption causes calculations to go |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
570 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
|
571 done.. */ |
4093
840d6403ef09
Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4087
diff
changeset
|
572 str = t_strdup_printf("%lld %d\n", (long long)bytes_diff, count_diff); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
573 if (write_full(root->fd, str, strlen(str)) < 0) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
574 ret = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
575 if (errno == ESTALE) { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
576 /* deleted/replaced already, ignore */ |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
577 } else { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
578 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
|
579 root->maildirsize_path); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
580 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
581 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
582 t_pop(); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
583 return ret; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
584 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
585 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
586 static struct quota_root *maildir_quota_alloc(void) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
587 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
588 struct maildir_quota_root *root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
589 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
590 root = i_new(struct maildir_quota_root, 1); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
591 root->fd = -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
592 root->message_bytes_limit = (uint64_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
593 root->message_count_limit = (uint64_t)-1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
594 return &root->root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
595 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
596 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
597 static void maildir_quota_deinit(struct quota_root *_root) |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
598 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
599 struct maildir_quota_root *root = (struct maildir_quota_root *)_root; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
600 |
4917
5d00d8a7888e
Fixed a file descriptor at deinit.
Timo Sirainen <tss@iki.fi>
parents:
4844
diff
changeset
|
601 if (root->fd != -1) |
5d00d8a7888e
Fixed a file descriptor at deinit.
Timo Sirainen <tss@iki.fi>
parents:
4844
diff
changeset
|
602 (void)close(root->fd); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
603 i_free(root); |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
604 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
605 |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
606 static bool |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
607 maildir_quota_parse_rule(struct quota_root *root ATTR_UNUSED, |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
608 struct quota_rule *rule, |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
609 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
|
610 { |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
611 uint64_t bytes, count; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
612 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
613 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
|
614 *error_r = "Invalid Maildir++ quota rule"; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
615 return FALSE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
616 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
617 |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
618 rule->bytes_limit = bytes; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
619 rule->count_limit = count; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
620 return TRUE; |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
621 } |
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
622 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
623 static void |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
624 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
|
625 struct mail_storage *storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
626 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
627 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
|
628 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
|
629 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
630 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
|
631 return; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
632 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
633 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
|
634 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
|
635 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
|
636 "/"MAILDIRSIZE_FILENAME, NULL); |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
637 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
638 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
639 static void |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
640 maildir_quota_storage_added(struct quota *quota, |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
641 struct mail_storage *_storage) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
642 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
643 struct maildir_storage *storage = |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
644 (struct maildir_storage *)_storage; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
645 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
|
646 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
|
647 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
648 if (strcmp(_storage->name, "maildir") != 0) |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
649 return; |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
650 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
651 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
|
652 for (i = 0; i < count; i++) { |
4514
511f1f5c76fa
Changes to make trash plugin working again.
Timo Sirainen <tss@iki.fi>
parents:
4509
diff
changeset
|
653 if (roots[i]->backend.name == quota_backend_maildir.name) |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
654 maildir_quota_root_storage_added(roots[i], _storage); |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
655 } |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
656 |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
657 /* For newly generated filenames add ,S=size. */ |
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
658 storage->save_size_in_filename = TRUE; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
659 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
660 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
661 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
|
662 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
|
663 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
664 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
|
665 QUOTA_NAME_STORAGE_KILOBYTES, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
666 QUOTA_NAME_MESSAGES, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
667 NULL |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
668 }; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
669 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
670 return resources_both; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
671 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
672 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
673 static int |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
674 maildir_quota_get_resource(struct quota_root *_root, const char *name, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
675 uint64_t *value_r, uint64_t *limit ATTR_UNUSED) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
676 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
677 struct maildir_quota_root *root = (struct maildir_quota_root *)_root; |
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 if (maildirquota_refresh(root) < 0) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
680 return -1; |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
681 |
4844
a0ba02928787
Bytes and kilobytes were somewhat mixed up everywhere. Also fixes a
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
682 if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) |
a0ba02928787
Bytes and kilobytes were somewhat mixed up everywhere. Also fixes a
Timo Sirainen <tss@iki.fi>
parents:
4808
diff
changeset
|
683 *value_r = root->total_bytes; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
684 else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
685 *value_r = root->total_count; |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
686 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
|
687 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
|
688 return 1; |
4086
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 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
691 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
|
692 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
|
693 struct quota_transaction_context *ctx) |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
694 { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
695 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
|
696 (struct maildir_quota_root *) _root; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
697 |
5566
88307a648e0e
Use sync_notify() callback to count expunges. This makes the calculation
Timo Sirainen <tss@iki.fi>
parents:
5293
diff
changeset
|
698 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
|
699 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
|
700 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
|
701 |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
702 return 0; |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
703 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
704 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
705 struct quota_backend quota_backend_maildir = { |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
706 "maildir", |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
707 |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
708 { |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
709 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
|
710 NULL, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
711 maildir_quota_deinit, |
5704
4bf8438b497f
Allow backend-specific quota rules with backend=<string>.
Timo Sirainen <tss@iki.fi>
parents:
5566
diff
changeset
|
712 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
|
713 maildir_quota_storage_added, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
714 maildir_quota_root_get_resources, |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
715 maildir_quota_get_resource, |
4509
e5e79558ac2d
Added support for multiple quota roots, rules and storages. The configuration
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4508
diff
changeset
|
716 maildir_quota_update |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
717 } |
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
718 }; |