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
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;
#include "hash.h"
#include "strescape.h"
#include "time-util.h"
+#include "master-service.h"
#include "doveadm.h"
#include "doveadm-print.h"
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;
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;
#include "hash.h"
#include "str.h"
#include "strescape.h"
+#include "master-service.h"
#include "doveadm.h"
#include "doveadm-print.h"
#include "doveadm-who.h"
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;
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 {
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;
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;
}
#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;