#include "virtual-storage.h"
#include "virtual-transaction.h"
+#define virtual_mail_container_of(mail) \
+ container_of( \
+ container_of( \
+ container_of(mail, struct mail_private, mail), \
+ struct index_mail, mail), \
+ struct virtual_mail, imail)
+
struct virtual_mail {
struct index_mail imail;
enum mail_fetch_field wanted_fields,
struct mailbox_header_lookup_ctx *wanted_headers)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)t->box;
+ struct virtual_mailbox *mbox =
+ container_of(t->box, struct virtual_mailbox, box);
struct virtual_mail *vmail;
pool_t mail_pool, data_pool;
static void virtual_mail_close(struct mail *mail)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail **mails;
unsigned int i, count;
mails = array_get_modifiable(&vmail->backend_mails, &count);
for (i = 0; i < count; i++) {
- struct mail_private *p = (struct mail_private *)mails[i];
+ struct mail_private *p =
+ container_of(mails[i], struct mail_private, mail);
if (vmail->imail.freeing)
mail_free(&mails[i]);
struct mail **backend_mail_r)
{
struct mail *mail = &vmail->imail.mail.mail;
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
+ struct virtual_mailbox *mbox =
+ container_of(mail->box, struct virtual_mailbox, box);
struct virtual_backend_box *bbox;
*backend_mail_r = NULL;
virtual_mail_set_backend_mail(struct mail *mail,
struct virtual_backend_box *bbox)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail_private *backend_pmail;
struct mailbox_transaction_context *backend_trans;
struct mailbox_header_lookup_ctx *backend_headers;
void virtual_mail_set_unattached_backend_mail(struct mail *mail,
struct mail *backend_mail)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail_private *backend_pmail;
vmail->cur_backend_mail = backend_mail;
static void virtual_mail_set_seq(struct mail *mail, uint32_t seq, bool saving)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
+ struct virtual_mailbox *mbox =
+ container_of(mail->box, struct virtual_mailbox, box);
const void *data;
i_assert(!saving);
static void virtual_mail_set_uid_cache_updates(struct mail *mail, bool set)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mail_private *p;
static bool virtual_mail_prefetch(struct mail *mail)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mail_private *p;
static int virtual_mail_precache(struct mail *mail)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mail_private *p;
enum mail_fetch_field fields,
struct mailbox_header_lookup_ctx *headers)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mailbox_header_lookup_ctx *backend_headers, *new_headers;
static int
virtual_mail_get_parts(struct mail *mail, struct message_part **parts_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static int
virtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
int tz;
static int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
int ret;
static int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
virtual_mail_get_first_header(struct mail *mail, const char *field,
bool decode_to_utf8, const char **value_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mail_private *p;
int ret;
virtual_mail_get_headers(struct mail *mail, const char *field,
bool decode_to_utf8, const char *const **value_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mail_private *p;
struct mailbox_header_lookup_ctx *headers,
struct istream **stream_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
struct mailbox_header_lookup_ctx *backend_headers;
int ret;
struct message_size *body_size,
struct istream **stream_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
- struct mail_private *vp = (struct mail_private *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
+ struct mail_private *vp =
+ container_of(mail, struct mail_private, mail);
struct mail *backend_mail;
const char *reason = t_strdup_printf("virtual mailbox %s: Opened mail UID=%u: %s",
mailbox_get_vname(mail->box), mail->uid, vp->get_stream_reason);
unsigned int *lines_r, bool *binary_r,
struct istream **stream_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
return -1;
- struct mail_private *p = (struct mail_private *)backend_mail;
+ struct mail_private *p =
+ container_of(backend_mail, struct mail_private, mail);
if (p->v.get_binary_stream(backend_mail, part, include_hdr,
size_r, lines_r, binary_r, stream_r) < 0) {
virtual_box_copy_error(mail->box, backend_mail->box);
virtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
const char **value_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static int virtual_mail_get_backend_mail(struct mail *mail,
struct mail **real_mail_r)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
static void virtual_mail_expunge(struct mail *mail)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
enum mail_fetch_field field,
const char *reason)
{
- struct virtual_mail *vmail = (struct virtual_mail *)mail;
+ struct virtual_mail *vmail = virtual_mail_container_of(mail);
struct mail *backend_mail;
if (backend_mail_get(vmail, &backend_mail) < 0)
struct mail_namespace *ns ATTR_UNUSED,
const char **error_r)
{
- struct virtual_storage *storage = (struct virtual_storage *)_storage;
+ struct virtual_storage *storage =
+ container_of(_storage, struct virtual_storage, storage);
const char *value;
value = mail_user_plugin_getenv(_storage->user, "virtual_max_open_mailboxes");
virtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list,
const char *vname, enum mailbox_flags flags)
{
- struct virtual_storage *storage = (struct virtual_storage *)_storage;
+ struct virtual_storage *storage =
+ container_of(_storage, struct virtual_storage, storage);
struct virtual_mailbox *mbox;
pool_t pool;
static int virtual_mailbox_open(struct mailbox *box)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
bool broken;
int ret = 0;
static void virtual_mailbox_close(struct mailbox *box)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
virtual_mailbox_close_internal(mbox);
index_storage_mailbox_close(box);
static void virtual_mailbox_free(struct mailbox *box)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
virtual_config_free(mbox);
index_storage_mailbox_free(box);
enum mailbox_status_items items,
struct mailbox_status *status_r)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
if ((items & STATUS_LAST_CACHED_SEQ) != 0)
items |= STATUS_MESSAGES;
enum mailbox_metadata_items items,
struct mailbox_metadata *metadata_r)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
return -1;
i_assert(box->opened);
static void virtual_notify_changes(struct mailbox *box)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
struct virtual_backend_box **bboxp;
if (box->notify_callback == NULL) {
const ARRAY_TYPE(seq_range) *backend_uids,
ARRAY_TYPE(seq_range) *virtual_uids_r)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
struct virtual_backend_box *bbox;
const struct virtual_backend_uidmap *uids;
ARRAY_TYPE(seq_range) uid_range;
const ARRAY_TYPE(seq_range) *backend_uids,
ARRAY_TYPE(uint32_t) *virtual_uids_r)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
struct virtual_backend_box *bbox;
const struct virtual_backend_uidmap *uids;
struct seq_range_iter iter;
ARRAY_TYPE(mailboxes) *mailboxes,
bool only_with_msgs)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
struct virtual_backend_box *const *bboxes;
unsigned int i, count;
static bool virtual_is_inconsistent(struct mailbox *box)
{
- struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+ struct virtual_mailbox *mbox =
+ container_of(box, struct virtual_mailbox, box);
if (mbox->inconsistent)
return TRUE;