quota-private.h revision 503e5ef896c7b4a51cf73efb0d132860a8c747e6
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#ifndef __QUOTA_PRIVATE_H
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#define __QUOTA_PRIVATE_H
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "mail-storage-private.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "quota.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen/* Modules should use do "my_id = quota_module_id++" and
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen use quota_module_contexts[id] for their own purposes. */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenextern unsigned int quota_module_id;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct quota {
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(roots, struct quota_root *);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen ARRAY_DEFINE(storages, struct mail_storage *);
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen int (*test_alloc)(struct quota_transaction_context *ctx,
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen uoff_t size, bool *too_large_r);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
fc84f8af4794f4bb6caf6e5ec3fb1f8cebd0462aTimo Sirainen unsigned int debug:1;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainenstruct quota_rule {
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen char *mailbox_name;
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen int64_t bytes_limit, count_limit;
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen};
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainenstruct quota_warning_rule {
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen uint64_t bytes_limit;
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen uint64_t count_limit;
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen char *command;
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen};
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstruct quota_backend_vfuncs {
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_root *(*alloc)(void);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int (*init)(struct quota_root *root, const char *args);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen void (*deinit)(struct quota_root *root);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen bool (*parse_rule)(struct quota_root *root, struct quota_rule *rule,
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen const char *str, const char **error_r);
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen /* called once for each backend */
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen void (*storage_added)(struct quota *quota,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mail_storage *storage);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen const char *const *(*get_resources)(struct quota_root *root);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen /* the limit is set by default, so it shouldn't normally need to
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen be changed. */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen int (*get_resource)(struct quota_root *root, const char *name,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen uint64_t *value_r, uint64_t *limit);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int (*update)(struct quota_root *root,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_transaction_context *ctx);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstruct quota_backend {
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen /* quota backends equal if backend1.name == backend2.name */
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen const char *name;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct quota_backend_vfuncs v;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstruct quota_root {
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen pool_t pool;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen /* Unique quota root name. */
73583cff4f0ca9ee87204256ca1994adf17cb94cTimo Sirainen const char *name;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen /* pointer to the quota that owns this root */
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota *quota;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen struct quota_backend backend;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_rule default_rule;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen ARRAY_DEFINE(rules, struct quota_rule);
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen ARRAY_DEFINE(warning_rules, struct quota_warning_rule);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* Module-specific contexts. See quota_module_id. */
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(quota_module_contexts, void);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct quota_transaction_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen union mailbox_transaction_module_context module_ctx;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct quota *quota;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mailbox *box;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int64_t bytes_used, count_used;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen uint64_t bytes_left, count_left;
fbdd091ef000e3ec4db34c054736c91ef9bc48ceTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mail *tmp_mail;
6800c6607013d4fdef5a4f764bae407301c6cce8Timo Sirainen
b2e181e33889f0a4a3ba9dc23d676cbfe1bf7782Timo Sirainen unsigned int limits_set:1;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen unsigned int failed:1;
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen unsigned int recalculate:1;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen/* Register storage to all user's quota roots. */
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenvoid quota_add_user_storage(struct quota *quota, struct mail_storage *storage);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainenvoid quota_remove_user_storage(struct quota *quota,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mail_storage *storage);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenint quota_count(struct quota *quota, uint64_t *bytes_r, uint64_t *count_r);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#endif