]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
anvil: Change VERSION line to be bidirectional and add -client/server suffix
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 5 Jan 2022 21:36:45 +0000 (23:36 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
This makes it more similar to other internal protocols, and allows using
connection API more easily.

src/anvil/anvil-connection.c
src/doveadm/doveadm-penalty.c
src/doveadm/doveadm-who.c
src/lib-master/anvil-client.c
src/master/service-anvil.c

index 7079d785afecb1d20332a46a35721fe33a9ad736..40139a4e33f5968bebeaae958d1cd4a34e6a786a 100644 (file)
@@ -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;
index d0ab4f30a6249af176e8f609f2d93dc41cb293f5..b152b06f5e2f2c8053badd850149994a13f38b38 100644 (file)
@@ -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;
index 98a4832e7da002af6feaabdd151e76235a8f0831..a2d7efacc6d66dece25e1c981558e7510d471c41 100644 (file)
@@ -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 {
index 1306165c56dca1f6793292851085a11753017594..e16e3706ec35b1670b6ac20adb22a82e66299dbd 100644 (file)
@@ -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;
 }
index 6003e8a7cbf26f998c33c7eff1ca4865dd5bd945..812e6d526a1d21c2aa38d01088b6308d44859ba6 100644 (file)
@@ -10,7 +10,7 @@
 
 #include <unistd.h>
 
-#define ANVIL_HANDSHAKE "VERSION\tanvil\t2\t0\n"
+#define ANVIL_HANDSHAKE "VERSION\tanvil-client\t2\t0\n"
 
 struct service_anvil_global *service_anvil_global;