From: Timo Sirainen Date: Wed, 2 Jun 2010 17:27:08 +0000 (+0100) Subject: Added version_string_verify() and removed code duplication with it. X-Git-Tag: 2.0.beta6~72 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f158d9a303bb15a6848ca276c9391c7ca52e452b;p=thirdparty%2Fdovecot%2Fcore.git Added version_string_verify() and removed code duplication with it. --HG-- branch : HEAD --- diff --git a/src/anvil/anvil-connection.c b/src/anvil/anvil-connection.c index 420556f059..09c045d848 100644 --- a/src/anvil/anvil-connection.c +++ b/src/anvil/anvil-connection.c @@ -131,7 +131,7 @@ anvil_connection_request(struct anvil_connection *conn, static void anvil_connection_input(void *context) { struct anvil_connection *conn = context; - const char *const *args, *error; + const char *line, *const *args, *error; switch (i_stream_read(conn->input)) { case -2: @@ -144,13 +144,11 @@ static void anvil_connection_input(void *context) } if (!conn->version_received) { - if ((args = anvil_connection_next_line(conn)) == NULL) + if ((line = i_stream_next_line(conn->input)) == NULL) return; - if (str_array_length(args) < 4 || - strcmp(args[0], "VERSION") != 0 || - strcmp(args[1], "anvil") != 0 || - !str_uint_equals(args[2], ANVIL_CLIENT_PROTOCOL_MAJOR_VERSION)) { + if (!version_string_verify(line, "anvil", + ANVIL_CLIENT_PROTOCOL_MAJOR_VERSION)) { i_error("Anvil client not compatible with this server " "(mixed old and new binaries?)"); anvil_connection_destroy(conn); diff --git a/src/auth/auth-worker-client.c b/src/auth/auth-worker-client.c index 16cd67d0a6..06b3653b23 100644 --- a/src/auth/auth-worker-client.c +++ b/src/auth/auth-worker-client.c @@ -584,8 +584,7 @@ static void auth_worker_input(struct auth_worker_client *client) if (line == NULL) return; - if (strncmp(line, "VERSION\tauth-worker\t", 20) != 0 || - !str_uint_equals(t_strcut(line + 20, '\t'), + if (!version_string_verify(line, "auth-worker", AUTH_WORKER_PROTOCOL_MAJOR_VERSION)) { i_error("Auth worker not compatible with this server " "(mixed old and new binaries?)"); diff --git a/src/config/config-connection.c b/src/config/config-connection.c index 87ea180f0c..35532715e3 100644 --- a/src/config/config-connection.c +++ b/src/config/config-connection.c @@ -162,8 +162,7 @@ static void config_connection_input(void *context) if (line == NULL) return; - if (strncmp(line, "VERSION\tconfig\t", 15) != 0 || - !str_uint_equals(t_strcut(line + 15, '\t'), + if (!version_string_verify(line, "config", CONFIG_CLIENT_PROTOCOL_MAJOR_VERSION)) { i_error("Config client not compatible with this server " "(mixed old and new binaries?)"); diff --git a/src/director/doveadm-connection.c b/src/director/doveadm-connection.c index d8a696f738..05fac1f38b 100644 --- a/src/director/doveadm-connection.c +++ b/src/director/doveadm-connection.c @@ -18,8 +18,8 @@ #include -#define DOVEADM_HANDSHAKE_EXPECTED "VERSION\tdirector-doveadm\t1\t" -#define DOVEADM_HANDSHAKE DOVEADM_HANDSHAKE_EXPECTED"0\n" +#define DOVEADM_PROTOCOL_VERSION_MAJOR 1 +#define DOVEADM_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n" #define MAX_VALID_VHOST_COUNT 1000 @@ -199,8 +199,8 @@ static void doveadm_connection_input(struct doveadm_connection *conn) if ((line = i_stream_read_next_line(conn->input)) == NULL) return; - if (strncmp(line, DOVEADM_HANDSHAKE_EXPECTED, - strlen(DOVEADM_HANDSHAKE_EXPECTED)) != 0) { + if (!version_string_verify(line, "director-doveadm", + DOVEADM_PROTOCOL_VERSION_MAJOR)) { i_error("doveadm not compatible with this server " "(mixed old and new binaries?)"); doveadm_connection_deinit(&conn); diff --git a/src/doveadm/doveadm-director.c b/src/doveadm/doveadm-director.c index b990df15dc..8e4177f154 100644 --- a/src/doveadm/doveadm-director.c +++ b/src/doveadm/doveadm-director.c @@ -3,6 +3,7 @@ #include "lib.h" #include "network.h" #include "istream.h" +#include "master-service.h" #include "doveadm.h" #include @@ -25,8 +26,7 @@ director_send(struct director_context *ctx, const char *data) static void director_connect(struct director_context *ctx) { -#define DIRECTOR_HANDSHAKE_EXPECTED "VERSION\tdirector-doveadm\t1\t" -#define DIRECTOR_HANDSHAKE DIRECTOR_HANDSHAKE_EXPECTED"0\n" +#define DIRECTOR_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n" const char *line; int fd; @@ -41,8 +41,7 @@ static void director_connect(struct director_context *ctx) line = i_stream_read_next_line(ctx->input); if (line == NULL) i_fatal("%s disconnected", ctx->socket_path); - if (strncmp(line, DIRECTOR_HANDSHAKE_EXPECTED, - strlen(DIRECTOR_HANDSHAKE_EXPECTED)) != 0) { + if (!version_string_verify(line, "director-doveadm", 1)) { i_fatal("%s not a compatible director-doveadm socket", ctx->socket_path); } diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 48a087cc35..6ce1665050 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -77,7 +77,7 @@ sig_state_changed(const siginfo_t *si ATTR_UNUSED, void *context) master_service_refresh_login_state(service); } -static void master_service_verify_version(struct master_service *service) +static void master_service_verify_version_string(struct master_service *service) { if (service->version_string != NULL && strcmp(service->version_string, PACKAGE_VERSION) != 0) { @@ -175,7 +175,7 @@ master_service_init(const char *name, enum master_service_flags flags, i_set_failure_prefix(t_strdup_printf("%s: ", name)); } - master_service_verify_version(service); + master_service_verify_version_string(service); return service; } @@ -872,3 +872,24 @@ void master_status_update(struct master_service *service) } } } + +bool version_string_verify(const char *line, const char *service_name, + unsigned major_version) +{ + unsigned int service_name_len = strlen(service_name); + bool ret; + + if (strncmp(line, "VERSION\t", 8) != 0) + return FALSE; + line += 8; + + if (strncmp(line, service_name, service_name_len) != 0 || + line[service_name_len] != '\t') + return FALSE; + line += service_name_len + 1; + + T_BEGIN { + ret = str_uint_equals(t_strcut(line, '\t'), major_version); + } T_END; + return ret; +} diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 16e08f5ed3..cc5a8c3c1e 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -119,4 +119,10 @@ void master_service_client_connection_destroyed(struct master_service *service); /* Deinitialize the service. */ void master_service_deinit(struct master_service **service); +/* Returns TRUE if line contains compatible service name and major version. + The line is expected to be in format: + VERSION service_name major version minor version */ +bool version_string_verify(const char *line, const char *service_name, + unsigned major_version); + #endif