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