static void mbox_prepare_resync(struct mail *mail)
{
- struct mbox_transaction_context *t =
- (struct mbox_transaction_context *)mail->transaction;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)mail->box;
+ struct mbox_transaction_context *t = MBOX_TRANSCTX(mail->transaction);
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(mail->box);
if (mbox->mbox_lock_type == F_RDLCK) {
if (mbox->mbox_lock_id == t->read_lock_id)
static int mbox_mail_seek(struct index_mail *mail)
{
- struct mbox_transaction_context *t =
- (struct mbox_transaction_context *)mail->mail.mail.transaction;
struct mail *_mail = &mail->mail.mail;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)_mail->box;
+ struct mbox_transaction_context *t = MBOX_TRANSCTX(_mail->transaction);
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(_mail->box);
enum mbox_sync_flags sync_flags = 0;
int ret, try;
bool deleted;
{
struct index_mail *mail = (struct index_mail *)_mail;
struct index_mail_data *data = &mail->data;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)_mail->box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(_mail->box);
if (index_mail_get_received_date(_mail, date_r) == 0)
return 0;
struct mail *_mail = &mail->mail.mail;
static uint8_t empty_md5[16] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)_mail->box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(_mail->box);
const void *ext_data;
if (mail->data.guid != NULL) {
const char **value_r)
{
struct index_mail *mail = (struct index_mail *)_mail;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)_mail->box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(_mail->box);
uoff_t offset;
bool move_offset;
int ret;
static int
mbox_mail_get_next_offset(struct index_mail *mail, uoff_t *next_offset_r)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)mail->mail.mail.box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(mail->mail.mail.box);
struct mail_index_view *view;
const struct mail_index_header *hdr;
uint32_t seq;
{
struct index_mail *mail = (struct index_mail *)_mail;
struct index_mail_data *data = &mail->data;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)_mail->box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(_mail->box);
struct istream *input;
struct message_size hdr_size;
uoff_t old_offset, body_offset, body_size, next_offset;
static int mbox_mail_init_stream(struct index_mail *mail)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)mail->mail.mail.box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(mail->mail.mail.box);
struct istream *raw_stream;
uoff_t hdr_offset, next_offset;
int ret;
bool finished:1;
};
+#define MBOX_SAVECTX(s) container_of(s, struct mbox_save_context, ctx)
+
static void write_error(struct mbox_save_context *ctx)
{
mbox_set_syscall_error(ctx->mbox, "write()");
static void mbox_save_init_sync(struct mailbox_transaction_context *t)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)t->box;
- struct mbox_save_context *ctx = (struct mbox_save_context *)t->save_ctx;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(t->box);
+ struct mbox_save_context *ctx = MBOX_SAVECTX(t->save_ctx);
const struct mail_index_header *hdr;
struct mail_index_view *view;
struct mail_save_context *
mbox_save_alloc(struct mailbox_transaction_context *t)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)t->box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(t->box);
struct mbox_save_context *ctx;
i_assert((t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
int mbox_save_begin(struct mail_save_context *_ctx, struct istream *input)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
struct mail_save_data *mdata = &_ctx->data;
- struct mbox_transaction_context *t =
- (struct mbox_transaction_context *)_ctx->transaction;
+ struct mbox_transaction_context *t = MBOX_TRANSCTX(_ctx->transaction);
enum mail_flags save_flags;
uint64_t offset;
int mbox_save_continue(struct mail_save_context *_ctx)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
const unsigned char *data;
size_t i, size;
ssize_t ret;
void mbox_save_cancel(struct mail_save_context *_ctx)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
ctx->failed = TRUE;
(void)mbox_save_finish(_ctx);
int mbox_transaction_save_commit_pre(struct mail_save_context *_ctx)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
struct mailbox_transaction_context *_t = _ctx->transaction;
struct mbox_mailbox *mbox = ctx->mbox;
struct stat st;
void mbox_transaction_save_commit_post(struct mail_save_context *_ctx,
struct mail_index_transaction_commit_result *result ATTR_UNUSED)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
i_assert(ctx->mbox->mbox_lock_type == F_WRLCK);
void mbox_transaction_save_rollback(struct mail_save_context *_ctx)
{
- struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
+ struct mbox_save_context *ctx = MBOX_SAVECTX(_ctx);
if (!ctx->finished)
mbox_save_cancel(&ctx->ctx);
mbox_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
const char **error_r)
{
- struct mbox_storage *storage = (struct mbox_storage *)_storage;
+ struct mbox_storage *storage = MBOX_STORAGE(_storage);
struct stat st;
const char *dir;
index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
- mbox->storage = (struct mbox_storage *)storage;
+ mbox->storage = MBOX_STORAGE(storage);
mbox->mbox_fd = -1;
mbox->mbox_lock_type = F_UNLCK;
mbox->mbox_list_index_ext_id = (uint32_t)-1;
static bool mbox_storage_is_readonly(struct mailbox *box)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
if (index_storage_is_readonly(box))
return TRUE;
static int mbox_mailbox_open(struct mailbox *box)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
struct stat st;
int ret;
static int
mbox_mailbox_update(struct mailbox *box, const struct mailbox_update *update)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
int ret = 0;
if (!box->opened) {
static void mbox_mailbox_close(struct mailbox *box)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
const struct mail_index_header *hdr;
enum mbox_sync_flags sync_flags = 0;
i_assert(mbox->mbox_lock_type == F_UNLCK);
box2 = mailbox_alloc(mbox->box.list, mbox->box.vname, 0);
ret = mailbox_sync(box2, 0);
- mbox2 = (struct mbox_mailbox *)box2;
+ mbox2 = MBOX_MAILBOX(box2);
memcpy(guid_r, mbox2->mbox_hdr.mailbox_guid, GUID_128_SIZE);
mailbox_free(&box2);
return ret;
enum mailbox_metadata_items items,
struct mailbox_metadata *metadata_r)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
return -1;
static void mbox_notify_changes(struct mailbox *box)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
if (box->notify_callback == NULL)
mailbox_watch_remove_all(box);
mbox_transaction_begin(struct mailbox *box,
enum mailbox_transaction_flags flags)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
struct mbox_transaction_context *mt;
if ((flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0)
mbox_transaction_unlock(struct mailbox *box, unsigned int lock_id1,
unsigned int lock_id2)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
if (lock_id1 != 0)
mbox_unlock(mbox, lock_id1);
mbox_transaction_commit(struct mailbox_transaction_context *t,
struct mail_transaction_commit_changes *changes_r)
{
- struct mbox_transaction_context *mt =
- (struct mbox_transaction_context *)t;
+ struct mbox_transaction_context *mt = MBOX_TRANSCTX(t);
struct mailbox *box = t->box;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
unsigned int read_lock_id = mt->read_lock_id;
unsigned int write_lock_id = mt->write_lock_id;
int ret;
static void
mbox_transaction_rollback(struct mailbox_transaction_context *t)
{
- struct mbox_transaction_context *mt =
- (struct mbox_transaction_context *)t;
+ struct mbox_transaction_context *mt = MBOX_TRANSCTX(t);
struct mailbox *box = t->box;
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
unsigned int read_lock_id = mt->read_lock_id;
unsigned int write_lock_id = mt->write_lock_id;
unsigned int write_lock_id;
};
+#define MBOX_STORAGE(s) container_of(s, struct mbox_storage, storage)
+#define MBOX_MAILBOX(s) container_of(s, struct mbox_mailbox, box)
+#define MBOX_TRANSCTX(s) container_of(s, struct mbox_transaction_context, t)
+
extern struct mail_vfuncs mbox_mail_vfuncs;
extern const char *mbox_hide_headers[], *mbox_save_drop_headers[];
extern unsigned int mbox_hide_headers_count, mbox_save_drop_headers_count;
struct mail_index_view *list_view,
uint32_t seq, bool quick)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
const struct mbox_list_index_record *rec;
const void *data;
const char *path;
struct mail_index_transaction *trans,
uint32_t seq)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
struct mail_index_view *list_view;
const struct mbox_index_header *mhdr = &mbox->mbox_hdr;
const struct mbox_list_index_record *old_rec;
struct mailbox_sync_context *
mbox_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
{
- struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
+ struct mbox_mailbox *mbox = MBOX_MAILBOX(box);
enum mbox_sync_flags mbox_sync_flags = 0;
int ret = 0;