From: Timo Sirainen Date: Fri, 29 Apr 2016 15:58:53 +0000 (+0300) Subject: quota: Cleanup - split quota_over_flag to init & run parts X-Git-Tag: 2.3.0.rc1~3902 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cfeebb6dde3a3140972797c610ae78cc25c0b36c;p=thirdparty%2Fdovecot%2Fcore.git quota: Cleanup - split quota_over_flag to init & run parts In preparation for the next change. --- diff --git a/src/plugins/quota/quota-private.h b/src/plugins/quota/quota-private.h index 5f3e1100ab..f1e7a2e1b7 100644 --- a/src/plugins/quota/quota-private.h +++ b/src/plugins/quota/quota-private.h @@ -131,6 +131,10 @@ struct quota_root { /* Module-specific contexts. See quota_module_id. */ ARRAY(void) quota_module_contexts; + /* Set to the current quota_over_flag, regardless of whether + it matches quota_over_flag_value mask. */ + const char *quota_over_flag; + /* don't enforce quota when saving */ unsigned int no_enforcing:1; /* If user has unlimited quota, disable quota tracking */ @@ -139,6 +143,8 @@ struct quota_root { unsigned int recounting:1; /* Quota root is hidden (to e.g. IMAP GETQUOTAROOT) */ unsigned int hidden:1; + /* Is user currently over quota? */ + unsigned int quota_over_flag_status:1; }; struct quota_transaction_context { diff --git a/src/plugins/quota/quota-storage.c b/src/plugins/quota/quota-storage.c index 52d0e2edaa..bc594f0582 100644 --- a/src/plugins/quota/quota-storage.c +++ b/src/plugins/quota/quota-storage.c @@ -663,5 +663,5 @@ void quota_mail_namespaces_created(struct mail_namespace *namespaces) for (i = 0; i < count; i++) quota_root_set_namespace(roots[i], namespaces); - quota_over_flag_check(namespaces->user, quota); + quota_over_flag_check(quota); } diff --git a/src/plugins/quota/quota.c b/src/plugins/quota/quota.c index 34119b59e0..0b9799c20b 100644 --- a/src/plugins/quota/quota.c +++ b/src/plugins/quota/quota.c @@ -46,6 +46,7 @@ static const struct quota_backend *quota_backends[] = { static int quota_default_test_alloc(struct quota_transaction_context *ctx, uoff_t size, bool *too_large_r); +static void quota_over_flag_check_root(struct quota_root *root); static const struct quota_backend *quota_backend_find(const char *name) { @@ -983,34 +984,35 @@ int quota_transaction_commit(struct quota_transaction_context **_ctx) return ret; } -static void -quota_over_flag_check_root(struct mail_user *user, struct quota_root *root) +static void quota_over_flag_init_root(struct quota_root *root) { - const char *name, *flag_mask, *overquota_value, *overquota_script; - const char *const *resources; - unsigned int i; - uint64_t value, limit; - bool overquota_flag, cur_overquota = FALSE; - int ret; - - name = t_strconcat(root->set->set_name, "_over_script", NULL); - overquota_script = mail_user_plugin_getenv(user, name); - if (overquota_script == NULL) - return; + const char *name, *flag_mask; /* e.g.: quota_over_flag_value=TRUE or quota_over_flag_value=* */ name = t_strconcat(root->set->set_name, "_over_flag_value", NULL); - flag_mask = mail_user_plugin_getenv(user, name); + flag_mask = mail_user_plugin_getenv(root->quota->user, name); if (flag_mask == NULL) return; /* compare quota_over_flag's value to quota_over_flag_value and save the result. */ name = t_strconcat(root->set->set_name, "_over_flag", NULL); - overquota_value = mail_user_plugin_getenv(user, name); - overquota_flag = overquota_value != NULL && - overquota_value[0] != '\0' && - wildcard_match_icase(overquota_value, flag_mask); + root->quota_over_flag = p_strdup_empty(root->pool, + mail_user_plugin_getenv(root->quota->user, name)); + root->quota_over_flag_status = root->quota_over_flag != NULL && + wildcard_match_icase(root->quota_over_flag, flag_mask); +} + +static void quota_over_flag_check_root(struct quota_root *root) +{ + const char *name, *overquota_script; + const char *const *resources; + unsigned int i; + uint64_t value, limit; + bool cur_overquota = FALSE; + int ret; + + quota_over_flag_init_root(root); resources = quota_root_get_resources(root); for (i = 0; resources[i] != NULL; i++) { @@ -1034,21 +1036,26 @@ quota_over_flag_check_root(struct mail_user *user, struct quota_root *root) } if (root->quota->set->debug) { i_debug("quota: quota_over_flag=%d(%s) vs currently overquota=%d", - overquota_flag, overquota_value == NULL ? "(null)" : overquota_value, + root->quota_over_flag_status, + root->quota_over_flag == NULL ? "(null)" : root->quota_over_flag, cur_overquota); } - if (cur_overquota != overquota_flag) - quota_warning_execute(root, overquota_script, overquota_value); + if (cur_overquota != root->quota_over_flag_status) { + name = t_strconcat(root->set->set_name, "_over_script", NULL); + overquota_script = mail_user_plugin_getenv(root->quota->user, name); + if (overquota_script != NULL) + quota_warning_execute(root, overquota_script, root->quota_over_flag); + } } -void quota_over_flag_check(struct mail_user *user, struct quota *quota) +void quota_over_flag_check(struct quota *quota) { struct quota_root *const *roots; unsigned int i, count; roots = array_get("a->roots, &count); for (i = 0; i < count; i++) - quota_over_flag_check_root(user, roots[i]); + quota_over_flag_check_root(roots[i]); } void quota_transaction_rollback(struct quota_transaction_context **_ctx) diff --git a/src/plugins/quota/quota.h b/src/plugins/quota/quota.h index 7b13f7bb78..460d5af7c6 100644 --- a/src/plugins/quota/quota.h +++ b/src/plugins/quota/quota.h @@ -84,6 +84,6 @@ void quota_free_bytes(struct quota_transaction_context *ctx, void quota_recalculate(struct quota_transaction_context *ctx); /* Execute quota_over_scripts if needed. */ -void quota_over_flag_check(struct mail_user *user, struct quota *quota); +void quota_over_flag_check(struct quota *quota); #endif