annotate src/plugins/quota/quota-maildir.c @ 8767:e82e0a6b9399 HEAD

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