doveadm-connection.c revision 2670cd577aa57eb9f915a4f4220ae48c9b4fc5fb
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
49a5412cbc98e630de17359c29cb8d6ce0e16168Lukas Slebodnik#define DOVEADM_HANDSHAKE_EXPECTED "VERSION\tdirector-doveadm\t1\t"
a2c10cf31d14bac598f5cd008973375c3f9575a6Lukas Slebodnik#define DOVEADM_HANDSHAKE DOVEADM_HANDSHAKE_EXPECTED"0\n"
da7a3c347dd630085839afa7ec245ee9d36f6ce2Lukas Slebodnikstatic struct doveadm_connection *doveadm_connections;
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashovstatic void doveadm_connection_deinit(struct doveadm_connection **_conn);
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnikstatic void doveadm_cmd_host_list(struct doveadm_connection *conn)
e64696e1fab85c42aaeda65ddf49ee1b7e3f07e1Lukas Slebodnik net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count,
e64696e1fab85c42aaeda65ddf49ee1b7e3f07e1Lukas Slebodnik o_stream_send(conn->output, str_data(str), str_len(str));
e64696e1fab85c42aaeda65ddf49ee1b7e3f07e1Lukas Slebodnikstatic void doveadm_cmd_director_list(struct doveadm_connection *conn)
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnik array_foreach(&conn->dir->dir_hosts, hostp) {
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnik net_ip2addr(&(*hostp)->ip), (*hostp)->port);
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnik o_stream_send(conn->output, str_data(str), str_len(str));
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnikdoveadm_cmd_host_set(struct doveadm_connection *conn, const char *line)
52ae4eeba9c97c0254a2025ec3b5ffe90588b775Lukas Slebodnik const char *const *args;
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0)) {
db0982c52294ee5ea08ed242d27660783fde29cdJakub Hrozek i_error("doveadm sent invalid HOST-SET parameters");
91b0592cdab22915dff27ceae6d8e49c608aea4aJakub Hrozek if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != -1U) {
53a4219e2f51cd0443931aa931505bf0b4bf5a45Nikolai Kondrashov o_stream_send_str(conn->output, "vhost count too large\n");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov mail_host_set_vhost_count(host, vhost_count);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov director_update_host(conn->dir, conn->dir->self_host, host);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashovdoveadm_cmd_host_remove(struct doveadm_connection *conn, const char *line)
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov i_error("doveadm sent invalid HOST-SET parameters");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov o_stream_send_str(conn->output, "NOTFOUND\n");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov director_remove_host(conn->dir, conn->dir->self_host, host);
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashovstatic void doveadm_connection_input(struct doveadm_connection *conn)
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov if ((line = i_stream_read_next_line(conn->input)) == NULL)
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov if (strncmp(line, DOVEADM_HANDSHAKE_EXPECTED,
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov strlen(DOVEADM_HANDSHAKE_EXPECTED)) != 0) {
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov i_error("doveadm not compatible with this server "
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov "(mixed old and new binaries?)");
9d453f1e8b28983b363b44c49b7cd701a994fd97Nikolai Kondrashov while ((line = i_stream_read_next_line(conn->input)) != NULL && ret) {
struct doveadm_connection *
return conn;
void doveadm_connections_deinit(void)