annotate src/plugins/quota/quota-maildir.c @ 4133:80eeec535031 HEAD

Return value of get_resource() was wrong, which caused quota reporting not to work.
author Timo Sirainen <tss@iki.fi>
date Thu, 06 Apr 2006 18:44:43 +0300
parents 840d6403ef09
children 8a61b892bd60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
1 /* Copyright (C) 2006 Timo Sirainen */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
2
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
3 #include "lib.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
4 #include "array.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
5 #include "ioloop.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
6 #include "nfs-workarounds.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
7 #include "file-dotlock.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
8 #include "read-full.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
9 #include "write-full.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
10 #include "str.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
11 #include "quota-private.h"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
12
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
13 #include <stdio.h>
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
14 #include <stdlib.h>
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
15 #include <dirent.h>
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
16 #include <sys/stat.h>
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
17
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
18 #define MAILDIRSIZE_FILENAME "maildirsize"
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
19 #define MAILDIRSIZE_STALE_SECS (60*15)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
20
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
21 struct maildir_quota_root {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
22 struct quota_root root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
23
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
24 uint64_t message_bytes_limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
25 uint64_t message_count_limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
26
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
27 uint64_t total_bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
28 uint64_t total_count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
29
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
30 int fd;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
31 };
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
32
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
33 struct maildir_list_context {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
34 struct mailbox_list_context *ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
35 struct mailbox_list *list;
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 string_t *path;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
38 int state;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
39 };
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
40
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
41 extern struct quota_backend quota_backend_maildir;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
42
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
43 const struct dotlock_settings dotlock_settings = {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
44 MEMBER(temp_prefix) NULL,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
45 MEMBER(lock_suffix) NULL,
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 MEMBER(timeout) 0,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
48 MEMBER(stale_timeout) 30,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
49
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
50 MEMBER(callback) NULL,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
51 MEMBER(context) NULL,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
52
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
53 MEMBER(use_excl_lock) FALSE
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
54 };
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
55
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
56 static int maildir_sum_dir(struct mail_storage *storage, const char *dir,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
57 uint64_t *total_bytes, uint64_t *total_count)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
58 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
59 DIR *dirp;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
60 struct dirent *dp;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
61 string_t *path;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
62 const char *p;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
63 size_t len;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
64 uoff_t num;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
65 int ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
66
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
67 dirp = opendir(dir);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
68 if (dirp == NULL) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
69 if (errno == ENOENT || errno == ESTALE)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
70 return 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
71 mail_storage_set_critical(storage, "opendir(%s) failed: %m",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
72 dir);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
73 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
74 }
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 path = t_str_new(256);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
77 str_append(path, dir);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
78 str_append_c(path, '/');
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
79
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
80 len = str_len(path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
81 while ((dp = readdir(dirp)) != NULL) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
82 p = strstr(dp->d_name, ",S=");
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
83 num = (uoff_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
84 if (p != NULL) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
85 /* ,S=nnnn[:,] */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
86 p += 3;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
87 for (num = 0; *p >= '0' && *p <= '9'; p++)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
88 num = num * 10 + (*p - '0');
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
89
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
90 if (*p != ':' && *p != '\0' && *p != ',') {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
91 /* not in expected format, fallback to stat() */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
92 num = (uoff_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
93 } else {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
94 *total_bytes += num;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
95 *total_count += 1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
96 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
97 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
98 if (num == (uoff_t)-1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
99 struct stat st;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
100
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
101 str_truncate(path, len);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
102 str_append(path, dp->d_name);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
103 if (stat(str_c(path), &st) == 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
104 *total_bytes += st.st_size;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
105 *total_count += 1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
106 } else if (errno != ENOENT && errno != ESTALE) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
107 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
108 "stat(%s) failed: %m", str_c(path));
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
109 ret = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
110 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
111 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
112 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
113
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
114 if (closedir(dirp) < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
115 mail_storage_set_critical(storage, "closedir(%s) failed: %m",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
116 dir);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
117 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
118 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
119 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
120 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
121
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
122 static struct maildir_list_context *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
123 maildir_list_init(struct mail_storage *storage)
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 struct maildir_list_context *ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
126
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
127 ctx = i_new(struct maildir_list_context, 1);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
128 ctx->path = str_new(default_pool, 512);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
129 ctx->ctx = mail_storage_mailbox_list_init(storage, "", "*",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
130 MAILBOX_LIST_FAST_FLAGS |
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
131 MAILBOX_LIST_INBOX);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
132 return ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
133 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
134
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
135 static const char *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
136 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
137 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
138 struct stat st;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
139 const char *path;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
140 bool is_file;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
141
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
142 for (;;) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
143 if (ctx->state == 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
144 ctx->list = mail_storage_mailbox_list_next(ctx->ctx);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
145 if (ctx->list == NULL)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
146 return NULL;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
147 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
148
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
149 t_push();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
150 path = mail_storage_get_mailbox_path(ctx->ctx->storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
151 ctx->list->name,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
152 &is_file);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
153 str_truncate(ctx->path, 0);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
154 str_append(ctx->path, path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
155 str_append(ctx->path, ctx->state == 0 ? "/new" : "/cur");
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
156 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
157
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
158 if (++ctx->state == 2)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
159 ctx->state = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
160
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
161 if (stat(str_c(ctx->path), &st) == 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
162 break;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
163 /* ignore if the directory got lost, stale or if it was
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
164 actually a file and not a directory */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
165 if (errno != ENOENT && errno != ESTALE && errno != ENOTDIR) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
166 mail_storage_set_critical(ctx->ctx->storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
167 "stat(%s) failed: %m", str_c(ctx->path));
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
168 ctx->state = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
169 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
170 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
171
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
172 *mtime_r = st.st_size;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
173 return str_c(ctx->path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
174 }
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 static int maildir_list_deinit(struct maildir_list_context *ctx)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
177 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
178 int ret = mail_storage_mailbox_list_deinit(&ctx->ctx);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
179
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
180 str_free(&ctx->path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
181 i_free(ctx);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
182 return ret;
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 static int
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
186 maildirs_check_have_changed(struct mail_storage *storage, time_t latest_mtime)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
187 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
188 struct maildir_list_context *ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
189 const char *dir;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
190 time_t mtime;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
191 int ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
192
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
193 ctx = maildir_list_init(storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
194 while ((dir = maildir_list_next(ctx, &mtime)) != NULL) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
195 if (mtime > latest_mtime) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
196 ret = 1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
197 break;
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 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
200 if (maildir_list_deinit(ctx) < 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
201 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
202 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
203 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
204
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
205 static int maildirsize_write(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
206 struct mail_storage *storage, const char *path)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
207 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
208 struct dotlock *dotlock;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
209 string_t *str;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
210 int fd;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
211
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
212 fd = file_dotlock_open(&dotlock_settings, path,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
213 DOTLOCK_CREATE_FLAG_NONBLOCK, &dotlock);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
214 if (fd == -1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
215 if (errno == EAGAIN) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
216 /* someone's just in the middle of updating it */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
217 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
218 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
219
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
220 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
221 "file_dotlock_open(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
222 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
223 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
224
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
225 str = t_str_new(128);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
226 if (root->message_bytes_limit != (uint64_t)-1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
227 str_printfa(str, "S=%llu",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
228 (unsigned long long)root->message_bytes_limit);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
229 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
230 if (root->message_count_limit != (uint64_t)-1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
231 if (str_len(str) > 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
232 str_append_c(str, ',');
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
233 str_printfa(str, "C=%llu",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
234 (unsigned long long)root->message_count_limit);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
235 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
236 str_printfa(str, "\n%llu %llu\n",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
237 (unsigned long long)root->total_bytes,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
238 (unsigned long long)root->total_count);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
239 if (write_full(fd, str_data(str), str_len(str)) < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
240 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
241 "write_full(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
242 file_dotlock_delete(&dotlock);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
243 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
244 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
245
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
246 if (file_dotlock_replace(&dotlock, 0) < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
247 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
248 "file_dotlock_replace(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
249 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
250 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
251 return 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
252 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
253
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
254 static const char *maildirsize_get_path(struct mail_storage *storage)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
255 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
256 return t_strconcat(mail_storage_get_mailbox_control_dir(storage, ""),
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
257 "/"MAILDIRSIZE_FILENAME, NULL);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
258 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
259
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
260 static int maildirsize_recalculate(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
261 struct mail_storage *storage)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
262 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
263 struct maildir_list_context *ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
264 const char *dir, *path;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
265 time_t mtime, last_stamp = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
266 int ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
267
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
268 root->total_bytes = root->total_count = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
269
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
270 ctx = maildir_list_init(storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
271 while ((dir = maildir_list_next(ctx, &mtime)) != NULL) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
272 if (mtime > last_stamp)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
273 last_stamp = mtime;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
274
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
275 t_push();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
276 if (maildir_sum_dir(storage, dir,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
277 &root->total_bytes,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
278 &root->total_count) < 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
279 ret = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
280 t_pop();
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 if (maildir_list_deinit(ctx) < 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
283 ret = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
284
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
285 if (ret == 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
286 ret = maildirs_check_have_changed(storage, last_stamp);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
287
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
288 t_push();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
289 path = maildirsize_get_path(storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
290 if (ret == 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
291 /* maildir didn't change, we can write the maildirsize file */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
292 ret = maildirsize_write(root, storage, path);
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 if (ret != 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
295 /* make sure it gets rebuilt later */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
296 if (unlink(path) < 0 && errno != ENOENT && errno != ESTALE) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
297 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
298 "unlink(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
299 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
300 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
301 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
302
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
303 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
304 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
305
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
306 static int maildirsize_parse(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
307 int fd, const char *const *lines)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
308 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
309 unsigned long long bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
310 long long bytes_diff, total_bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
311 int count_diff, total_count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
312 unsigned int line_count = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
313 const char *const *limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
314 char *pos;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
315
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
316 if (*lines == NULL)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
317 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
318
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
319 /* first line contains the limits */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
320 root->message_bytes_limit = (uint64_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
321 root->message_count_limit = (uint64_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
322 for (limit = t_strsplit(lines[0], ","); *limit != NULL; limit++) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
323 bytes = strtoull(*limit, &pos, 10);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
324 if (pos[0] != '\0' && pos[1] == '\0') {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
325 switch (pos[0]) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
326 case 'C':
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
327 root->message_count_limit = bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
328 break;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
329 case 'S':
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
330 root->message_bytes_limit = bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
331 break;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
332 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
333 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
334 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
335
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
336 /* rest of the lines contains <bytes> <count> diffs */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
337 total_bytes = 0; total_count = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
338 for (lines++; **lines != '\0'; lines++, line_count++) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
339 if (sscanf(*lines, "%lld %d", &bytes_diff, &count_diff) != 2)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
340 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
341
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
342 total_bytes += bytes_diff;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
343 total_count += count_diff;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
344 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
345 /* we end always with LF, which shows up as empty last line. there
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
346 should be no other empty lines */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
347 if (lines[1] != NULL)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
348 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
349
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
350 if (total_bytes < 0 || total_count < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
351 /* corrupted */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
352 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
353 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
354
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
355 if ((uint64_t)total_bytes > root->message_bytes_limit ||
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
356 (uint64_t)total_count > root->message_count_limit) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
357 /* 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
358 contains more than the initial summary line, or if the file
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
359 is older than 15 minutes. */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
360 struct stat st;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
361
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
362 if (line_count > 1)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
363 return 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
364
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
365 if (fstat(fd, &st) < 0 ||
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
366 st.st_mtime < ioloop_time - MAILDIRSIZE_STALE_SECS)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
367 return 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
368 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
369 root->total_bytes = (uint64_t)total_bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
370 root->total_count = (uint64_t)total_count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
371 return 1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
372 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
373
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
374 static int maildirsize_read(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
375 struct mail_storage *storage)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
376 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
377 const char *path;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
378 char buf[5120+1];
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
379 unsigned int size;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
380 int fd, ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
381
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
382 t_push();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
383 path = maildirsize_get_path(storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
384 if (root->fd != -1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
385 if (close(root->fd) < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
386 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
387 "close(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
388 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
389 root->fd = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
390 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
391
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
392 fd = nfs_safe_open(path, O_RDWR | O_APPEND);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
393 if (fd == -1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
394 if (errno == ENOENT)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
395 ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
396 else {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
397 ret = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
398 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
399 "open(%s) failed: %m", path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
400 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
401 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
402 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
403 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
404
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
405 size = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
406 while ((ret = read(fd, buf, sizeof(buf)-1)) != 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
407 if (ret < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
408 if (errno == ESTALE)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
409 break;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
410 mail_storage_set_critical(storage, "read(%s) failed: %m",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
411 path);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
412 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
413 size += ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
414 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
415 if (ret < 0 || size == sizeof(buf)-1) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
416 /* error / recalculation needed. */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
417 (void)close(fd);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
418 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
419 return ret < 0 ? -1 : 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
420 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
421
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
422 /* file is smaller than 5120 bytes, which means we can use it */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
423 root->total_bytes = root->total_count = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
424
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
425 /* skip the last line if there's no LF at the end */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
426 while (size > 0 && buf[size-1] != '\n') size--;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
427 buf[size] = '\0';
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
428
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
429 if (maildirsize_parse(root, fd, t_strsplit(buf, "\n")) > 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
430 root->fd = fd;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
431 ret = 1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
432 } else {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
433 /* broken file / need recalculation */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
434 (void)close(root->fd);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
435 root->fd = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
436 ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
437 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
438 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
439 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
440 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
441
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
442 static int maildirquota_refresh(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
443 struct mail_storage *storage)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
444 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
445 int ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
446
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
447 ret = maildirsize_read(root, storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
448 if (ret == 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
449 ret = maildirsize_recalculate(root, storage);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
450 return ret < 0 ? -1 : 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
451 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
452
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
453 static int maildirsize_update(struct maildir_quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
454 struct mail_storage *storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
455 int count_diff, int64_t bytes_diff)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
456 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
457 const char *str;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
458 int ret = 0;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
459
4093
840d6403ef09 Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4087
diff changeset
460 if (count_diff == 0 && bytes_diff == 0)
840d6403ef09 Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4087
diff changeset
461 return 0;
840d6403ef09 Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4087
diff changeset
462
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
463 t_push();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
464
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
465 /* 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
466 isn't necessarily that bad because the file is recreated once in
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
467 a while, and sooner if corruption cases calculations to go
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
468 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
469 done.. */
4093
840d6403ef09 Fixes to updating maildirsize.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4087
diff changeset
470 str = t_strdup_printf("%lld %d\n", (long long)bytes_diff, count_diff);
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
471 if (write_full(root->fd, str, strlen(str)) < 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
472 ret = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
473 if (errno == ESTALE) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
474 /* deleted/replaced already, ignore */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
475 } else {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
476 mail_storage_set_critical(storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
477 "write_full(%s) failed: %m",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
478 maildirsize_get_path(storage));
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
479 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
480 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
481 t_pop();
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
482 return ret;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
483 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
484
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
485 static struct quota_root *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
486 maildir_quota_init(struct quota_setup *setup __attr_unused__,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
487 const char *name __attr_unused__)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
488 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
489 struct maildir_quota_root *root;
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 root = i_new(struct maildir_quota_root, 1);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
492 root->root.name = i_strdup(name);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
493 root->root.v = quota_backend_maildir.v;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
494 root->fd = -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
495 root->message_bytes_limit = (uint64_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
496 root->message_count_limit = (uint64_t)-1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
497
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
498 return &root->root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
499 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
500
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
501 static void maildir_quota_deinit(struct quota_root *_root)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
502 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
503 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
504
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
505 i_free(root->root.name);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
506 i_free(root);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
507 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
508
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
509 static bool
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
510 maildir_quota_add_storage(struct quota_root *root __attr_unused__,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
511 struct mail_storage *storage __attr_unused__)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
512 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
513 return TRUE;
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
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
516 static void
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
517 maildir_quota_remove_storage(struct quota_root *root __attr_unused__,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
518 struct mail_storage *storage __attr_unused__)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
519 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
520 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
521
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
522 static const char *const *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
523 maildir_quota_root_get_resources(struct quota_root *root __attr_unused__)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
524 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
525 static const char *resources_both[] = {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
526 QUOTA_NAME_STORAGE,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
527 QUOTA_NAME_MESSAGES,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
528 NULL
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
529 };
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
530
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
531 return resources_both;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
532 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
533
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
534 static struct mail_storage *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
535 maildir_quota_root_get_storage(struct quota_root *root)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
536 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
537 /* FIXME: figure out how to support multiple storages */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
538 struct mail_storage *const *storages;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
539 unsigned int count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
540
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
541 storages = array_get(&root->storages, &count);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
542 i_assert(count > 0);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
543
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
544 return storages[0];
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
545 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
546
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
547 static int
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
548 maildir_quota_get_resource(struct quota_root *_root, const char *name,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
549 uint64_t *value_r, uint64_t *limit_r)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
550 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
551 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
552
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
553 if (maildirquota_refresh(root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
554 maildir_quota_root_get_storage(_root)) < 0)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
555 return -1;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
556
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
557 if (strcmp(name, QUOTA_NAME_STORAGE) == 0) {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
558 *limit_r = root->message_bytes_limit / 1024;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
559 *value_r = root->total_bytes / 1024;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
560 } else {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
561 *limit_r = root->message_count_limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
562 *value_r = root->total_count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
563 }
4133
80eeec535031 Return value of get_resource() was wrong, which caused quota reporting not
Timo Sirainen <tss@iki.fi>
parents: 4093
diff changeset
564 return 1;
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
565 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
566
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
567 static int
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
568 maildir_quota_set_resource(struct quota_root *root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
569 const char *name __attr_unused__,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
570 uint64_t value __attr_unused__)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
571 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
572 quota_set_error(root->setup->quota, MAIL_STORAGE_ERR_NO_PERMISSION);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
573 return -1;
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
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
576 static struct quota_root_transaction_context *
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
577 maildir_quota_transaction_begin(struct quota_root *_root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
578 struct quota_transaction_context *_ctx)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
579 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
580 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
581 struct quota_root_transaction_context *ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
582
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
583 ctx = i_new(struct quota_root_transaction_context, 1);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
584 ctx->root = _root;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
585 ctx->ctx = _ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
586
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
587 if (maildirquota_refresh(root,
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
588 maildir_quota_root_get_storage(_root)) < 0) {
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
589 /* failed calculating the current quota */
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
590 ctx->bytes_current = (uint64_t)-1;
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
591 } else {
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
592 ctx->bytes_limit = root->message_bytes_limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
593 ctx->count_limit = root->message_count_limit;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
594 ctx->bytes_current = root->total_bytes;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
595 ctx->count_current = root->total_count;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
596 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
597 return ctx;
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
598 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
599
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
600 static int
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
601 maildir_quota_transaction_commit(struct quota_root_transaction_context *ctx)
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
602 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
603 struct maildir_quota_root *root =
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
604 (struct maildir_quota_root *)ctx->root;
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
605 int ret = ctx->bytes_current == (uint64_t)-1 ? -1 : 0;
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
606
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
607 if (root->fd != -1 && ret == 0) {
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
608 /* if writing fails, we don't care all that much */
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
609 (void)maildirsize_update(root,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
610 maildir_quota_root_get_storage(ctx->root),
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
611 ctx->count_diff, ctx->bytes_diff);
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
612 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
613 i_free(ctx);
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
614 return ret;
4086
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
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
617 struct quota_backend quota_backend_maildir = {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
618 "maildir",
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
619
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
620 {
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
621 maildir_quota_init,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
622 maildir_quota_deinit,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
623
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
624 maildir_quota_add_storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
625 maildir_quota_remove_storage,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
626
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
627 maildir_quota_root_get_resources,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
628
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
629 maildir_quota_get_resource,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
630 maildir_quota_set_resource,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
631
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
632 maildir_quota_transaction_begin,
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
633 maildir_quota_transaction_commit,
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
634 quota_default_transaction_rollback,
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
635
4087
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
636 quota_default_try_alloc,
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
637 quota_default_try_alloc_bytes,
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
638 quota_default_alloc,
61fc347bcceb Cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4086
diff changeset
639 quota_default_free
4086
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
640 }
07c3a801c3dc Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
641 };