Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 588 maildir_quota_root_get_storage(_root)) < 0) { |
589 /* failed calculating the current quota */ | |
590 ctx->bytes_current = (uint64_t)-1; | |
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 | 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 | 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 | 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 | 634 quota_default_transaction_rollback, |
4086
07c3a801c3dc
Maildir++ quota support.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
635 |
4087 | 636 quota_default_try_alloc, |
637 quota_default_try_alloc_bytes, | |
638 quota_default_alloc, | |
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 }; |