return root->maildirsize_path != NULL;
}
-static int
-maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
+static int maildirquota_read_limits(struct maildir_quota_root *root)
{
int ret;
- *recalculated_r = FALSE;
if (!maildirquota_limits_init(root))
- return 0;
+ return 1;
T_BEGIN {
ret = maildirsize_read(root);
} T_END;
+ return ret;
+}
+
+static int
+maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
+{
+ int ret;
+
+ *recalculated_r = FALSE;
+
+ ret = maildirquota_read_limits(root);
if (ret == 0) {
if (root->root.bytes_limit == 0 &&
root->root.count_limit == 0 &&
return TRUE;
}
+static int maildir_quota_init_limits(struct quota_root *_root)
+{
+ struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
+
+ return maildirquota_read_limits(root) < 0 ? -1 : 0;
+}
+
static void
maildir_quota_root_namespace_added(struct quota_root *_root,
struct mail_namespace *ns)
maildir_quota_init,
maildir_quota_deinit,
maildir_quota_parse_rule,
+ maildir_quota_init_limits,
maildir_quota_namespace_added,
maildir_quota_root_get_resources,
maildir_quota_get_resource,
return ret;
}
-static bool quota_root_get_rule_limits(struct quota_root *root,
- const char *mailbox_name,
- uint64_t *bytes_limit_r,
- uint64_t *count_limit_r)
+static int quota_root_get_rule_limits(struct quota_root *root,
+ const char *mailbox_name,
+ uint64_t *bytes_limit_r,
+ uint64_t *count_limit_r)
{
struct quota_rule *rule;
int64_t bytes_limit, count_limit;
bool found;
+ if (!root->set->force_default_rule) {
+ if (root->backend.v.init_limits(root) < 0)
+ return -1;
+ }
+
bytes_limit = root->bytes_limit;
count_limit = root->count_limit;
*bytes_limit_r = bytes_limit <= 0 ? 0 : bytes_limit;
*count_limit_r = count_limit <= 0 ? 0 : count_limit;
- return found;
+ return found ? 1 : 0;
}
void quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns)
if (ret <= 0)
return ret;
- (void)quota_root_get_rule_limits(root, mailbox_name,
- &bytes_limit, &count_limit);
+ if (quota_root_get_rule_limits(root, mailbox_name,
+ &bytes_limit, &count_limit) < 0)
+ return -1;
+
if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0)
*limit_r = bytes_limit;
else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0)
if (!quota_root_is_visible(roots[i], ctx->box, TRUE))
continue;
- (void)quota_root_get_rule_limits(roots[i], mailbox_name,
- &bytes_limit, &count_limit);
+ if (quota_root_get_rule_limits(roots[i], mailbox_name,
+ &bytes_limit,
+ &count_limit) < 0) {
+ ctx->failed = TRUE;
+ return -1;
+ }
if (bytes_limit > 0) {
ret = quota_get_resource(roots[i], mailbox_name,
{
struct quota_root *const *roots;
unsigned int i, count;
+ int ret;
*too_large_r = FALSE;
if (!quota_root_is_visible(roots[i], ctx->box, TRUE))
continue;
- if (!quota_root_get_rule_limits(roots[i],
- mailbox_get_vname(ctx->box),
- &bytes_limit, &count_limit))
+ ret = quota_root_get_rule_limits(roots[i],
+ mailbox_get_vname(ctx->box),
+ &bytes_limit, &count_limit);
+ if (ret == 0)
continue;
+ if (ret < 0)
+ return -1;
/* if size is bigger than any limit, then
it is bigger than the lowest limit */
break;
}
}
-
return 0;
}