anvil-client.c revision 82d29ac2af30acd837abc32a71b526dc6846ebca
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen ARRAY_DEFINE(queries_arr, struct anvil_query);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen#define ANVIL_HANDSHAKE "VERSION\tanvil\t1\t0\n"
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenstatic void anvil_client_disconnect(struct anvil_client *client);
82d29ac2af30acd837abc32a71b526dc6846ebcaTimo Sirainenanvil_client_init(const char *path, bool (*reconnect_callback)(void),
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen client->reconnect_callback = reconnect_callback;
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen client->queries = aqueue_init(&client->queries_arr.arr);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenvoid anvil_client_deinit(struct anvil_client **_client)
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenstatic void anvil_reconnect(struct anvil_client *client)
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen /* no reconnection */
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenstatic void anvil_input(struct anvil_client *client)
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen unsigned int count;
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen queries = array_get(&client->queries_arr, &count);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen while ((line = i_stream_read_next_line(client->input)) != NULL) {
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen query = &queries[aqueue_idx(client->queries, 0)];
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen i_error("read(%s) failed: EOF", client->path);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenint anvil_client_connect(struct anvil_client *client, bool retry)
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen fd = retry ? net_connect_unix_with_retries(client->path, 5000) :
82d29ac2af30acd837abc32a71b526dc6846ebcaTimo Sirainen (client->flags & ANVIL_CLIENT_FLAG_HIDE_ENOENT) == 0) {
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen client->input = i_stream_create_fd(fd, ANVIL_INBUF_SIZE, FALSE);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen client->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen client->io = io_add(fd, IO_READ, anvil_input, client);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen o_stream_send_str(client->output, ANVIL_HANDSHAKE);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenstatic void anvil_client_cancel_queries(struct anvil_client *client)
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen unsigned int count;
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen queries = array_get(&client->queries_arr, &count);
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainen query = &queries[aqueue_idx(client->queries, 0)];
83879fb63453dc3b96269d2217339e14dca753b4Timo Sirainenstatic void anvil_client_disconnect(struct anvil_client *client)
82d29ac2af30acd837abc32a71b526dc6846ebcaTimo Sirainenstatic int anvil_client_send(struct anvil_client *client, const char *cmd)
82d29ac2af30acd837abc32a71b526dc6846ebcaTimo Sirainenvoid anvil_client_query(struct anvil_client *client, const char *query,
82d29ac2af30acd837abc32a71b526dc6846ebcaTimo Sirainenvoid anvil_client_cmd(struct anvil_client *client, const char *cmd)