dsync-ibc.c revision f476a2abe41082176e65425358bf01bdcc86a41c
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen/* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "lib.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "dsync-mail.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "dsync-ibc-private.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_deinit(struct dsync_ibc **_ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen struct dsync_ibc *ibc = *_ibc;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen *_ibc = NULL;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.deinit(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_set_io_callback(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen io_callback_t *callback, void *context)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->io_callback = callback;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->io_context = context;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_send_handshake(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_ibc_settings *set)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_handshake(ibc, set);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_handshake(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_ibc_settings **set_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_handshake(ibc, set_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstatic enum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_ret(struct dsync_ibc *ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.is_send_queue_full(ibc) ?
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_SEND_RET_FULL :
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_SEND_RET_OK;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_end_of_list(struct dsync_ibc *ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_end_of_list(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox_state(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_state *state)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mailbox_state(ibc, state);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mailbox_state(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen struct dsync_mailbox_state *state_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mailbox_state(ibc, state_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox_tree_node(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const char *const *name,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_node *node)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen i_assert(*name != NULL);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mailbox_tree_node(ibc, name, node);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mailbox_tree_node(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const char *const **name_r,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_node **node_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mailbox_tree_node(ibc, name_r, node_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox_deletes(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_delete *deletes,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen unsigned int count, char hierarchy_sep)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mailbox_deletes(ibc, deletes, count,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen hierarchy_sep);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mailbox_deletes(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_delete **deletes_r,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen unsigned int *count_r, char *hierarchy_sep_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mailbox_deletes(ibc, deletes_r, count_r,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen hierarchy_sep_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox *dsync_box)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mailbox(ibc, dsync_box);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mailbox(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox **dsync_box_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mailbox(ibc, dsync_box_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_change(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_change *change)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen i_assert(change->uid > 0);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_change(ibc, change);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_change(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_change **change_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_change(ibc, change_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mail_request(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_request *request)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen i_assert(*request->guid != '\0' || request->uid != 0);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mail_request(ibc, request);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mail_request(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_request **request_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mail_request(ibc, request_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mail(struct dsync_ibc *ibc, const struct dsync_mail *mail)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen i_assert(*mail->guid != '\0' || mail->uid != 0);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen T_BEGIN {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen ibc->v.send_mail(ibc, mail);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen } T_END;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return dsync_ibc_send_ret(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mail(struct dsync_ibc *ibc, struct dsync_mail **mail_r)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.recv_mail(ibc, mail_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
f476a2abe41082176e65425358bf01bdcc86a41cTimo Sirainenvoid dsync_ibc_close_mail_streams(struct dsync_ibc *ibc)
f476a2abe41082176e65425358bf01bdcc86a41cTimo Sirainen{
f476a2abe41082176e65425358bf01bdcc86a41cTimo Sirainen ibc->v.close_mail_streams(ibc);
f476a2abe41082176e65425358bf01bdcc86a41cTimo Sirainen}
f476a2abe41082176e65425358bf01bdcc86a41cTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_has_failed(struct dsync_ibc *ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->failed;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_is_send_queue_full(struct dsync_ibc *ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.is_send_queue_full(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_has_pending_data(struct dsync_ibc *ibc)
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen{
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen return ibc->v.has_pending_data(ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen}