From: Timo Sirainen Date: Wed, 5 Jan 2022 21:36:45 +0000 (+0200) Subject: anvil: Change VERSION line to be bidirectional and add -client/server suffix X-Git-Tag: 2.4.0~4503 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ef09ea047e44e089471b41b6becd965e9b579660;p=thirdparty%2Fdovecot%2Fcore.git anvil: Change VERSION line to be bidirectional and add -client/server suffix This makes it more similar to other internal protocols, and allows using connection API more easily. --- diff --git a/src/anvil/anvil-connection.c b/src/anvil/anvil-connection.c index 7079d785af..40139a4e33 100644 --- a/src/anvil/anvil-connection.c +++ b/src/anvil/anvil-connection.c @@ -269,7 +269,7 @@ anvil_connection_input_line(struct connection *_conn, const char *line) const char *const *args, *error; if (!conn->conn.version_received) { - if (!version_string_verify(line, "anvil", + if (!version_string_verify(line, "anvil-client", ANVIL_CLIENT_PROTOCOL_MAJOR_VERSION)) { if (anvil_restarted && (conn->master || conn->fifo)) { /* old pending data. ignore input until we get @@ -314,6 +314,8 @@ void anvil_connection_create(int fd, bool master, bool fifo) if (!fifo) { conn->conn.output = o_stream_create_fd(fd, SIZE_MAX); o_stream_set_no_error_handling(conn->conn.output, TRUE); + o_stream_nsend_str(conn->conn.output, + "VERSION\tanvil-server\t2\t0\n"); } conn->master = master; conn->fifo = fifo; diff --git a/src/doveadm/doveadm-penalty.c b/src/doveadm/doveadm-penalty.c index d0ab4f30a6..b152b06f5e 100644 --- a/src/doveadm/doveadm-penalty.c +++ b/src/doveadm/doveadm-penalty.c @@ -7,6 +7,7 @@ #include "hash.h" #include "strescape.h" #include "time-util.h" +#include "master-service.h" #include "doveadm.h" #include "doveadm-print.h" @@ -59,7 +60,7 @@ penalty_print_line(struct penalty_context *ctx, static void penalty_lookup(struct penalty_context *ctx) { -#define ANVIL_HANDSHAKE "VERSION\tanvil\t2\t0\n\n" +#define ANVIL_HANDSHAKE "VERSION\tanvil-client\t2\t0\n\n" #define ANVIL_CMD ANVIL_HANDSHAKE"PENALTY-DUMP\n" struct istream *input; const char *line; @@ -71,6 +72,11 @@ static void penalty_lookup(struct penalty_context *ctx) i_fatal("write(%s) failed: %m", ctx->anvil_path); input = i_stream_create_fd_autoclose(&fd, SIZE_MAX); + if ((line = i_stream_read_next_line(input)) == NULL) + i_fatal("anvil didn't send VERSION line"); + if (!version_string_verify(line, "anvil-server", 2)) + i_fatal("Invalid VERSION line: %s", line); + while ((line = i_stream_read_next_line(input)) != NULL) { if (*line == '\0') break; diff --git a/src/doveadm/doveadm-who.c b/src/doveadm/doveadm-who.c index 98a4832e7d..a2d7efacc6 100644 --- a/src/doveadm/doveadm-who.c +++ b/src/doveadm/doveadm-who.c @@ -8,6 +8,7 @@ #include "hash.h" #include "str.h" #include "strescape.h" +#include "master-service.h" #include "doveadm.h" #include "doveadm-print.h" #include "doveadm-who.h" @@ -183,7 +184,7 @@ int who_parse_args(struct who_context *ctx, const char *const *masks) struct doveadm_who_iter *doveadm_who_iter_init(const char *anvil_path) { -#define ANVIL_HANDSHAKE "VERSION\tanvil\t2\t0\n\n" +#define ANVIL_HANDSHAKE "VERSION\tanvil-client\t2\t0\n\n" #define ANVIL_CMD ANVIL_HANDSHAKE"CONNECT-DUMP\n" struct doveadm_who_iter *iter; const char *line; @@ -206,6 +207,12 @@ struct doveadm_who_iter *doveadm_who_iter_init(const char *anvil_path) iter->input = i_stream_create_fd_autoclose(&fd, SIZE_MAX); i_stream_set_name(iter->input, anvil_path); if ((line = i_stream_read_next_line(iter->input)) == NULL) { + i_error("anvil didn't send VERSION line"); + iter->failed = TRUE; + } else if (!version_string_verify(line, "anvil-server", 2)) { + i_error("Invalid VERSION line: %s", line); + iter->failed = TRUE; + } else if ((line = i_stream_read_next_line(iter->input)) == NULL) { i_error("anvil didn't send header line"); iter->failed = TRUE; } else { diff --git a/src/lib-master/anvil-client.c b/src/lib-master/anvil-client.c index 1306165c56..e16e3706ec 100644 --- a/src/lib-master/anvil-client.c +++ b/src/lib-master/anvil-client.c @@ -147,6 +147,17 @@ static int anvil_client_input_line(struct connection *conn, const char *line) struct anvil_query *query; unsigned int count; + if (!conn->version_received) { + const char *const *args = t_strsplit_tabescaped(line); + if (connection_handshake_args_default(conn, args) < 0) { + conn->disconnect_reason = + CONNECTION_DISCONNECT_HANDSHAKE_FAILED; + return -1; + } + anvil_client_start_multiplex_input(client); + return 1; + } + if (aqueue_count(client->queries) == 0) { e_error(client->conn.event, "Unexpected input: %s", line); return -1; @@ -193,7 +204,6 @@ int anvil_client_connect(struct anvil_client *client, bool retry) master_service_get_name(master_service), my_pid); o_stream_nsend_str(client->conn.output, anvil_handshake); - anvil_client_start_multiplex_input(client); anvil_client_start_multiplex_output(client); return 0; } diff --git a/src/master/service-anvil.c b/src/master/service-anvil.c index 6003e8a7cb..812e6d526a 100644 --- a/src/master/service-anvil.c +++ b/src/master/service-anvil.c @@ -10,7 +10,7 @@ #include -#define ANVIL_HANDSHAKE "VERSION\tanvil\t2\t0\n" +#define ANVIL_HANDSHAKE "VERSION\tanvil-client\t2\t0\n" struct service_anvil_global *service_anvil_global;