int quota_get_mail_size(struct quota_transaction_context *ctx,
struct mail *mail, uoff_t *size_r);
+void quota_used_apply_expunged(int64_t *used, uint64_t expunged);
bool quota_transaction_is_over(struct quota_transaction_context *ctx, uoff_t size);
bool quota_root_is_over(struct quota_transaction_context *ctx,
struct quota_transaction_root_context *root,
return FALSE;
}
+void quota_used_apply_expunged(int64_t *used, uint64_t expunged)
+{
+ int64_t exp_signed;
+ int64_t exp_overflow;
+
+ if (expunged < (uint64_t)INT64_MAX) {
+ exp_overflow = 0;
+ exp_signed = (int64_t)expunged;
+ } else {
+ exp_overflow = (int64_t)(expunged - INT64_MAX);
+ exp_signed = INT64_MAX;
+ }
+
+ if (INT64_MIN + exp_signed > *used)
+ *used = INT64_MIN;
+ else
+ *used -= exp_signed;
+ if (INT64_MIN + (int64_t)exp_overflow > *used)
+ *used = INT64_MIN;
+ else
+ *used -= exp_overflow;
+}
+
bool quota_transaction_is_over(struct quota_transaction_context *ctx,
uoff_t size)
{