doveadm-connection.c revision 2670cd577aa57eb9f915a4f4220ae48c9b4fc5fb
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
eb209d12e3b1cfed564c35cf19fdb1bf7fcc6811Timo Sirainen#define DOVEADM_HANDSHAKE_EXPECTED "VERSION\tdirector-doveadm\t1\t"
09060303d565e15d54e42b4ef722f9d3c26f5336Timo Sirainen#define DOVEADM_HANDSHAKE DOVEADM_HANDSHAKE_EXPECTED"0\n"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic struct doveadm_connection *doveadm_connections;
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainenstatic void doveadm_connection_deinit(struct doveadm_connection **_conn);
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainenstatic void doveadm_cmd_host_list(struct doveadm_connection *conn)
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count,
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainen o_stream_send(conn->output, str_data(str), str_len(str));
c13fce16374a6fa8d127742c527498d38e777789Timo Sirainenstatic void doveadm_cmd_director_list(struct doveadm_connection *conn)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen o_stream_send(conn->output, str_data(str), str_len(str));
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainendoveadm_cmd_host_set(struct doveadm_connection *conn, const char *line)
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainen const char *const *args;
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainen (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0)) {
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainen i_error("doveadm sent invalid HOST-SET parameters");
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainen if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != -1U) {
1b7cd57585d8c2f133dd612d2d5d9c775595659fTimo Sirainen o_stream_send_str(conn->output, "vhost count too large\n");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director_update_host(conn->dir, conn->dir->self_host, host);
009217abb57a24a4076092e8e4e165545747839eStephan Boschdoveadm_cmd_host_remove(struct doveadm_connection *conn, const char *line)
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen i_error("doveadm sent invalid HOST-SET parameters");
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen o_stream_send_str(conn->output, "NOTFOUND\n");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director_remove_host(conn->dir, conn->dir->self_host, host);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void doveadm_connection_input(struct doveadm_connection *conn)
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen if ((line = i_stream_read_next_line(conn->input)) == NULL)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_error("doveadm not compatible with this server "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "(mixed old and new binaries?)");
58b8a301b7b36047f10a592751094fbed86d6f0cTimo Sirainen while ((line = i_stream_read_next_line(conn->input)) != NULL && ret) {
ece0a20249ce26208db3415ba2e79423678856f8Timo Sirainen else if (strncmp(line, "HOST-REMOVE\t", 12) == 0)
ece0a20249ce26208db3415ba2e79423678856f8Timo Sirainen ret = doveadm_cmd_host_remove(conn, line + 12);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_error("doveadm sent unknown command: %s", line);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen if (conn->input->eof || conn->input->stream_errno != 0 || !ret)
1df39b899804fd1dbc560f75382364822935c857Timo Sirainendoveadm_connection_init(struct director *dir, int fd)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen conn->input = i_stream_create_fd(conn->fd, 1024, FALSE);
009217abb57a24a4076092e8e4e165545747839eStephan Bosch conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen conn->io = io_add(conn->fd, IO_READ, doveadm_connection_input, conn);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen o_stream_send_str(conn->output, DOVEADM_HANDSHAKE);
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainenstatic void doveadm_connection_deinit(struct doveadm_connection **_conn)
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen i_error("close(doveadm connection) failed: %m");