dsync-ibc.h revision 707f172cd4e4c91af86ff5bd82a60a873dec6f70
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#ifndef DSYNC_IBC_H
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#define DSYNC_IBC_H
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen/* dsync inter-brain communicator */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "ioloop.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "guid.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#include "dsync-brain.h"
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mailbox;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mailbox_state;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mailbox_node;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mailbox_delete;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mail;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mail_change;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_mail_request;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_SEND_RET_OK = 1,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen /* send queue is full, stop sending more */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_SEND_RET_FULL = 0
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen};
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_RECV_RET_FINISHED = -1,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen /* try again / error (the error handling delayed until io callback) */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_RECV_RET_TRYAGAIN = 0,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen DSYNC_IBC_RECV_RET_OK = 1
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen};
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_ibc_settings {
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen /* if non-NULL, sync only this namespace */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const char *sync_ns_prefix;
707f172cd4e4c91af86ff5bd82a60a873dec6f70Timo Sirainen /* if non-NULL, sync only this mailbox name */
707f172cd4e4c91af86ff5bd82a60a873dec6f70Timo Sirainen const char *sync_box;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen enum dsync_brain_sync_type sync_type;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen enum dsync_brain_flags brain_flags;
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen};
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_init_pipe(struct dsync_ibc **ibc1_r,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen struct dsync_ibc **ibc2_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenstruct dsync_ibc *
5332128f69ad688cc024897c2a92f6b37ef8d05cTimo Sirainendsync_ibc_init_stream(struct istream *input, struct ostream *output,
5332128f69ad688cc024897c2a92f6b37ef8d05cTimo Sirainen const char *name, const char *temp_path_prefix);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_deinit(struct dsync_ibc **ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen/* I/O callback is called whenever new data is available. It's also called on
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen errors, so check first the error status. */
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_set_io_callback(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen io_callback_t *callback, void *context);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_send_handshake(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_ibc_settings *set);
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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_end_of_list(struct dsync_ibc *ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox_state(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox_state *state);
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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
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 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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
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 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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mailbox(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mailbox *dsync_box);
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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_change(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_change *change);
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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mail_request(struct dsync_ibc *ibc,
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen const struct dsync_mail_request *request);
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 Sirainenenum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_send_mail(struct dsync_ibc *ibc, const struct dsync_mail *mail);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenenum dsync_ibc_recv_ret
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainendsync_ibc_recv_mail(struct dsync_ibc *ibc, struct dsync_mail **mail_r);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenvoid dsync_ibc_flush(struct dsync_ibc *ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_has_failed(struct dsync_ibc *ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_is_send_queue_full(struct dsync_ibc *ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainenbool dsync_ibc_has_pending_data(struct dsync_ibc *ibc);
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen#endif