view src/doveadm/dsync/dsync-slave.h @ 14682:d0d7b810646b

Make sure we check all the functions' return values. Minor API changes to simplify this. Checked using a patched clang that adds attribute(warn_unused_result) to all functions. This commit fixes several error handling mistakes.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jun 2012 01:14:03 +0300
parents b2076acc3715
children 128c598d2870
line wrap: on
line source

#ifndef DSYNC_SLAVE_H
#define DSYNC_SLAVE_H

#include "ioloop.h"
#include "guid.h"
#include "dsync-brain.h"

struct dsync_mailbox;
struct dsync_mailbox_state;
struct dsync_mailbox_node;
struct dsync_mailbox_delete;
struct dsync_mail;
struct dsync_mail_change;
struct dsync_mail_request;
struct dsync_slave_settings;

enum dsync_slave_send_ret {
	DSYNC_SLAVE_SEND_RET_OK		= 1,
	/* send queue is full, stop sending more */
	DSYNC_SLAVE_SEND_RET_FULL	= 0
};

enum dsync_slave_recv_ret {
	DSYNC_SLAVE_RECV_RET_FINISHED	= -1,
	/* try again / error (the error handling delayed until io callback) */
	DSYNC_SLAVE_RECV_RET_TRYAGAIN	= 0,
	DSYNC_SLAVE_RECV_RET_OK	= 1
};

struct dsync_slave_settings {
	/* if non-NULL, sync only this namespace */
	const char *sync_ns_prefix;

	enum dsync_brain_sync_type sync_type;
	bool guid_requests;
	bool mails_have_guids;
};

void dsync_slave_init_pipe(struct dsync_slave **slave1_r,
			   struct dsync_slave **slave2_r);
struct dsync_slave *
dsync_slave_init_io(int fd_in, int fd_out, const char *name,
		    const char *temp_path_prefix);
void dsync_slave_deinit(struct dsync_slave **slave);

/* I/O callback is called whenever new data is available. It's also called on
   errors, so check first the error status. */
void dsync_slave_set_io_callback(struct dsync_slave *slave,
				 io_callback_t *callback, void *context);

void dsync_slave_send_handshake(struct dsync_slave *slave,
				const struct dsync_slave_settings *set);
enum dsync_slave_recv_ret
dsync_slave_recv_handshake(struct dsync_slave *slave,
			   const struct dsync_slave_settings **set_r);

void dsync_slave_send_end_of_list(struct dsync_slave *slave);

enum dsync_slave_send_ret
dsync_slave_send_mailbox_state(struct dsync_slave *slave,
			       const struct dsync_mailbox_state *state);
enum dsync_slave_recv_ret
dsync_slave_recv_mailbox_state(struct dsync_slave *slave,
			       struct dsync_mailbox_state *state_r);

enum dsync_slave_send_ret
dsync_slave_send_mailbox_tree_node(struct dsync_slave *slave,
				   const char *const *name,
				   const struct dsync_mailbox_node *node);
enum dsync_slave_recv_ret
dsync_slave_recv_mailbox_tree_node(struct dsync_slave *slave,
				   const char *const **name_r,
				   const struct dsync_mailbox_node **node_r);

enum dsync_slave_send_ret
dsync_slave_send_mailbox_deletes(struct dsync_slave *slave,
				 const struct dsync_mailbox_delete *deletes,
				 unsigned int count, char hierarchy_sep);
enum dsync_slave_recv_ret
dsync_slave_recv_mailbox_deletes(struct dsync_slave *slave,
				 const struct dsync_mailbox_delete **deletes_r,
				 unsigned int *count_r, char *hierarchy_sep_r);

enum dsync_slave_send_ret
dsync_slave_send_mailbox(struct dsync_slave *slave,
			 const struct dsync_mailbox *dsync_box);
enum dsync_slave_recv_ret
dsync_slave_recv_mailbox(struct dsync_slave *slave,
			 const struct dsync_mailbox **dsync_box_r);

enum dsync_slave_send_ret
dsync_slave_send_change(struct dsync_slave *slave,
			const struct dsync_mail_change *change);
enum dsync_slave_recv_ret
dsync_slave_recv_change(struct dsync_slave *slave,
			const struct dsync_mail_change **change_r);

enum dsync_slave_send_ret
dsync_slave_send_mail_request(struct dsync_slave *slave,
			      const struct dsync_mail_request *request);
enum dsync_slave_recv_ret
dsync_slave_recv_mail_request(struct dsync_slave *slave,
			      const struct dsync_mail_request **request_r);

enum dsync_slave_send_ret
dsync_slave_send_mail(struct dsync_slave *slave,
		      const struct dsync_mail *mail);
enum dsync_slave_recv_ret
dsync_slave_recv_mail(struct dsync_slave *slave,
		      struct dsync_mail **mail_r);

void dsync_slave_flush(struct dsync_slave *slave);
bool dsync_slave_has_failed(struct dsync_slave *slave);
bool dsync_slave_is_send_queue_full(struct dsync_slave *slave);
bool dsync_slave_has_pending_data(struct dsync_slave *slave);

#endif