annotate src/plugins/quota/quota-maildir.c @ 8961:b2cd58981808 HEAD

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