quota-private.h revision 10207755f33a4cf1a1e901968137ae4f2bc93bbf
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen/* Modules should use do "my_id = quota_module_id++" and
72f67d7d7681934bb3d4baaea1d88f79521dee3dTimo Sirainen use quota_module_contexts[id] for their own purposes. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenextern unsigned int quota_module_id;
50fe5e053d565b40b0ed2cc7a64b6b98971c0305Timo Sirainen ARRAY(struct quota_root_settings *) root_sets;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen struct quota_transaction_context *ctx, uoff_t size);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* relative to default_rule */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Don't include this mailbox in quota */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen int (*init)(struct quota_root *root, const char *args,
94163c620a8880024d0e8bbb503c788159fa222bTimo Sirainen const char **error_r);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen bool (*parse_rule)(struct quota_root_settings *root_set,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* called once for each namespace */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char *const *(*get_resources)(struct quota_root *root);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen bool (*match_box)(struct quota_root *root, struct mailbox *box);
d84c270231a617298088f597474a73f4a14921aeTimo Sirainen /* quota backends equal if backend1.name == backend2.name */
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen /* Unique quota root name. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Name in settings, e.g. "quota", "quota2", .. */
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen ARRAY(struct quota_warning_rule) warning_rules;
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen /* If user is under quota before saving a mail, allow the last mail to
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen bring the user over quota by this many bytes. */
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen /* Limits in default_rule override backend's quota limits */
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen /* TRUE if any of the warning_rules have reverse==TRUE */
d84c270231a617298088f597474a73f4a14921aeTimo Sirainen /* this quota root applies only to this namespace. it may also be
d84c270231a617298088f597474a73f4a14921aeTimo Sirainen a public namespace without an owner. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* this is set in quota init(), because namespaces aren't known yet.
396999508030c8498cb538eb8943e6b61394994cTimo Sirainen when accessing shared users the ns_prefix may be non-NULL but
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen ns=NULL, so when checking if quota root applies only to a specific
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen namespace use the ns_prefix!=NULL check. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* initially the same as set->default_rule.*_limit, but some backends
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen may change these by reading the limits elsewhere (e.g. Maildir++,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Module-specific contexts. See quota_module_id. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* don't enforce quota when saving */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* quota is automatically updated. update() should be called but the
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen bytes won't be changed. count is still changed, because it's cheap
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen to do and it's internally used to figure out whether there have
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen been some changes and that quota_warnings should be checked. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* If user has unlimited quota, disable quota tracking */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Set while quota is being recalculated to avoid recursion. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Quota root is hidden (to e.g. IMAP GETQUOTAROOT) */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* Did we already check quota_over_flag correctness? */
396999508030c8498cb538eb8943e6b61394994cTimo Sirainen union mailbox_transaction_module_context module_ctx;
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* how many bytes/mails can be saved until limit is reached.
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen (set once, not updated by bytes_used/count_used).
56439f2879ad690d9ac637e2b90b612760d2f219Timo Sirainen if last_mail_max_extra_bytes>0, the bytes_ceil is initially
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen increased by that much, while bytes_ceil2 contains the real ceiling.
396999508030c8498cb538eb8943e6b61394994cTimo Sirainen after the first allocation is done, bytes_ceil is set to
396999508030c8498cb538eb8943e6b61394994cTimo Sirainen bytes_ceil2. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* How many bytes/mails we are over quota. Like *_ceil, these are set
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen only once and not updated by bytes_used/count_used. (Either *_ceil
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen or *_over is always zero.) */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen /* TRUE if all roots have auto_updating=TRUE */
4b94ae3dcbace4781b64e87aea00ec0bc03a0d8aTimo Sirainen /* Quota doesn't need to be updated within this transaction. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen/* Register storage to all user's quota roots. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenvoid quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenvoid quota_remove_user_namespace(struct mail_namespace *ns);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenint quota_root_default_init(struct quota_root *root, const char *args,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char **error_r);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenstruct quota *quota_get_mail_user_quota(struct mail_user *user);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenbool quota_root_is_namespace_visible(struct quota_root *root,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenquota_root_rule_find(struct quota_root_settings *root_set, const char *name);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenvoid quota_root_recalculate_relative_rules(struct quota_root_settings *root_set,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen/* Returns 1 if values were returned successfully, 0 if we're recursing into
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen the same function, -1 if error. */
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenint quota_count(struct quota_root *root, uint64_t *bytes_r, uint64_t *count_r);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenint quota_root_parse_grace(struct quota_root_settings *root_set,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenbool quota_warning_match(const struct quota_warning_rule *w,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen uint64_t bytes_before, uint64_t bytes_current,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen uint64_t count_before, uint64_t count_current,
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainen const char **reason_r);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenbool quota_transaction_is_over(struct quota_transaction_context *ctx, uoff_t size);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenint quota_transaction_set_limits(struct quota_transaction_context *ctx);
e9e5e84ffb2ce2e606a24ce6d930580367562ff0Timo Sirainenvoid quota_backend_register(const struct quota_backend *backend);