annotate src/plugins/quota/quota-maildir.c @ 6411:6a64e64fa3a3 HEAD

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