/* limits have changed, so we'll need to recalculate
relative quota rules */
- quota_root_recalculate_relative_rules(_root->set, bytes_limit, count_limit);
+ quota_root_recalculate_relative_rules(_root->backend.event,
+ _root->set, bytes_limit, count_limit);
}
return QUOTA_GET_RESULT_LIMITED;
}
/* we're using limits from the file. */
root->root.bytes_limit = message_bytes_limit;
root->root.count_limit = message_count_limit;
- quota_root_recalculate_relative_rules(root->root.set,
+ quota_root_recalculate_relative_rules(_root->backend.event,
+ root->root.set,
message_bytes_limit,
message_count_limit);
}
pool_t pool;
ARRAY(struct quota_root_settings *) root_sets;
- struct event *event;
enum quota_alloc_result (*test_alloc)(
struct quota_transaction_context *ctx, uoff_t size,
const char **error_r);
struct quota_rule *
quota_root_rule_find(struct quota_root_settings *root_set, const char *name);
-void quota_root_recalculate_relative_rules(struct quota_root_settings *root_set,
+void quota_root_recalculate_relative_rules(struct event *event,
+ struct quota_root_settings *root_set,
int64_t bytes_limit,
int64_t count_limit);
/* Returns 1 if values were returned successfully, 0 if we're recursing into
int quota_count(struct quota_root *root, uint64_t *bytes_r, uint64_t *count_r,
enum quota_get_result *error_result_r, const char **error_r);
-int quota_root_parse_grace(struct quota_root_settings *root_set,
+int quota_root_parse_grace(struct event *event,
+ struct quota_root_settings *root_set,
const char *value, const char **error_r);
bool quota_warning_match(const struct quota_warning_rule *w,
uint64_t bytes_before, uint64_t bytes_current,
rule->count_limit = count_limit * rule->count_percent / 100;
}
-void quota_root_recalculate_relative_rules(struct quota_root_settings *root_set,
+void quota_root_recalculate_relative_rules(struct event *event,
+ struct quota_root_settings *root_set,
int64_t bytes_limit,
int64_t count_limit)
{
bytes_limit, 0);
root_set->last_mail_max_extra_bytes = root_set->grace_rule.bytes_limit;
- e_debug(root_set->set->event,
+ e_debug(event,
"Quota root %s: Recalculated relative rules with "
"bytes=%lld count=%lld. Now grace=%"PRIu64, root_set->name,
(long long)bytes_limit, (long long)count_limit,
}
static int
-quota_rule_parse_limits(struct quota_root_settings *root_set,
+quota_rule_parse_limits(struct event *event,
+ struct quota_root_settings *root_set,
struct quota_rule *rule, const char *limits,
const char *full_rule_def,
bool relative_rule, const char **error_r)
}
value++;
} else if (*value != '-' && relative_rule) {
- e_warning(root_set->set->event, "quota root %s rule %s: "
+ e_warning(event, "quota root %s rule %s: "
"obsolete configuration for rule '%s' "
"should be changed to '%s=+%s'",
root_set->name, full_rule_def,
return 0;
}
-int quota_root_add_rule(struct quota_root_settings *root_set,
+int quota_root_add_rule(struct event *event,
+ struct quota_root_settings *root_set,
const char *rule_def, const char **error_r)
{
struct quota_rule *rule;
if (strcmp(p, "ignore") == 0) {
rule->ignore = TRUE;
- e_debug(root_set->set->event,
- "Quota rule: root=%s mailbox=%s ignored",
+ e_debug(event, "Quota rule: root=%s mailbox=%s ignored",
root_set->name, mailbox_mask);
return 0;
}
} else {
bool relative_rule = rule != &root_set->default_rule;
- if (quota_rule_parse_limits(root_set, rule, p, rule_def,
+ if (quota_rule_parse_limits(event, root_set, rule, p, rule_def,
relative_rule, error_r) < 0)
ret = -1;
}
- quota_root_recalculate_relative_rules(root_set,
+ quota_root_recalculate_relative_rules(event, root_set,
root_set->default_rule.bytes_limit,
root_set->default_rule.count_limit);
const char *rule_plus =
rule == &root_set->default_rule ? "" : "+";
- e_debug(root_set->set->event, "Quota rule: root=%s mailbox=%s "
+ e_debug(event, "Quota rule: root=%s mailbox=%s "
"bytes=%s%lld%s messages=%s%lld%s",
root_set->name, mailbox_mask,
rule->bytes_limit > 0 ? rule_plus : "",
return ret;
}
-int quota_root_add_warning_rule(struct quota_root_settings *root_set,
+int quota_root_add_warning_rule(struct event *event,
+ struct quota_root_settings *root_set,
const char *rule_def, const char **error_r)
{
struct quota_warning_rule *warning;
}
i_zero(&rule);
- ret = quota_rule_parse_limits(root_set, &rule, t_strdup_until(q, p),
+ ret = quota_rule_parse_limits(event, root_set, &rule, t_strdup_until(q, p),
rule_def, FALSE, error_r);
if (ret < 0)
return -1;
if (reverse)
root_set->have_reverse_warnings = TRUE;
- quota_root_recalculate_relative_rules(root_set,
+ quota_root_recalculate_relative_rules(event, root_set,
root_set->default_rule.bytes_limit,
root_set->default_rule.count_limit);
- e_debug(root_set->set->event, "Quota warning: bytes=%"PRId64"%s "
+ e_debug(event, "Quota warning: bytes=%"PRId64"%s "
"messages=%"PRId64"%s reverse=%s command=%s",
warning->rule.bytes_limit,
warning->rule.bytes_percent == 0 ? "" :
return 0;
}
-int quota_root_parse_grace(struct quota_root_settings *root_set,
+int quota_root_parse_grace(struct event *event,
+ struct quota_root_settings *root_set,
const char *value, const char **error_r)
{
const char *p;
quota_rule_recalculate_relative_rules(&root_set->grace_rule,
root_set->default_rule.bytes_limit, 0);
root_set->last_mail_max_extra_bytes = root_set->grace_rule.bytes_limit;
- e_debug(root_set->set->event, "Quota grace: root=%s bytes=%lld%s",
+ e_debug(event, "Quota grace: root=%s bytes=%lld%s",
root_set->name, (long long)root_set->grace_rule.bytes_limit,
root_set->grace_rule.bytes_percent == 0 ? "" :
t_strdup_printf(" (%u%%)", root_set->grace_rule.bytes_percent));
if (rule == NULL)
break;
- if (quota_root_add_rule(root_set, rule, &error) < 0) {
+ if (quota_root_add_rule(user->event, root_set, rule, &error) < 0) {
*error_r = t_strdup_printf("Invalid rule %s: %s",
rule, error);
return -1;
if (rule == NULL)
break;
- if (quota_root_add_warning_rule(root_set, rule, &error) < 0) {
+ if (quota_root_add_warning_rule(user->event, root_set, rule, &error) < 0) {
*error_r = t_strdup_printf("Invalid warning rule: %s",
rule);
return -1;
}
static int
-quota_root_settings_init(struct quota_settings *quota_set, const char *root_def,
+quota_root_settings_init(struct event *event,
+ struct quota_settings *quota_set, const char *root_def,
struct quota_root_settings **set_r,
const char **error_r)
{
}
root_set->args = p_strdup(quota_set->pool, args);
- e_debug(quota_set->event, "Quota root: name=%s backend=%s args=%s",
+ e_debug(event, "Quota root: name=%s backend=%s args=%s",
root_set->name, backend_name, args == NULL ? "" : args);
p_array_init(&root_set->rules, quota_set->pool, 4);
struct quota_root_settings *root_set;
const char *set_name, *value;
- if (quota_root_settings_init(quota_set, env, &root_set, error_r) < 0)
+ if (quota_root_settings_init(user->event, quota_set, env,
+ &root_set, error_r) < 0)
return -1;
root_set->set_name = p_strdup(quota_set->pool, root_name);
if (quota_root_add_rules(user, root_name, root_set, error_r) < 0)
set_name = t_strconcat(root_name, "_grace", NULL);
value = mail_user_plugin_getenv(user, set_name);
- if (quota_root_parse_grace(root_set, value, error_r) < 0) {
+ if (quota_root_parse_grace(user->event, root_set, value, error_r) < 0) {
*error_r = t_strdup_printf("Invalid %s value '%s': %s",
set_name, value, *error_r);
return -1;
pool = pool_alloconly_create("quota settings", 2048);
quota_set = p_new(pool, struct quota_settings, 1);
quota_set->pool = pool;
- quota_set->event = event_create(user->event);
quota_set->test_alloc = quota_default_test_alloc;
quota_set->quota_exceeded_msg =
mail_user_plugin_getenv(user, "quota_exceeded_message");
&error) < 0) {
*error_r = t_strdup_printf("Invalid quota root %s: %s",
root_name, error);
- event_unref("a_set->event);
pool_unref(&pool);
return -1;
}
}
if (quota_set->max_mail_size == 0 &&
array_count("a_set->root_sets) == 0) {
- event_unref("a_set->event);
pool_unref(&pool);
return 0;
}
*_quota_set = NULL;
- event_unref("a_set->event);
pool_unref("a_set->pool);
}
void quota_settings_deinit(struct quota_settings **quota_set);
/* Add a new rule too the quota root. Returns 0 if ok, -1 if rule is invalid. */
-int quota_root_add_rule(struct quota_root_settings *root_set,
+int quota_root_add_rule(struct event *event,
+ struct quota_root_settings *root_set,
const char *rule_def, const char **error_r);
/* Add a new warning rule for the quota root. Returns 0 if ok, -1 if rule is
invalid. */
-int quota_root_add_warning_rule(struct quota_root_settings *root_set,
+int quota_root_add_warning_rule(struct event *event,
+ struct quota_root_settings *root_set,
const char *rule_def, const char **error_r);
/* Initialize quota for the given user. Returns 0 and quota_r on success,