]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added version_string_verify() and removed code duplication with it.
authorTimo Sirainen <tss@iki.fi>
Wed, 2 Jun 2010 17:27:08 +0000 (18:27 +0100)
committerTimo Sirainen <tss@iki.fi>
Wed, 2 Jun 2010 17:27:08 +0000 (18:27 +0100)
--HG--
branch : HEAD

src/anvil/anvil-connection.c
src/auth/auth-worker-client.c
src/config/config-connection.c
src/director/doveadm-connection.c
src/doveadm/doveadm-director.c
src/lib-master/master-service.c
src/lib-master/master-service.h

index 420556f059495fa336fcd901b477de1079798f60..09c045d848267a6e920ccd965860d340c9a35eb2 100644 (file)
@@ -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);
index 16cd67d0a651cb537edcd21804a12467d502d8af..06b3653b23452d16c8d1e444d392220a52da37c6 100644 (file)
@@ -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?)");
index 87ea180f0ce9fd7c9715f2282b3b0c9e33e8ff07..35532715e39a588183d560b7de927e903929f030 100644 (file)
@@ -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?)");
index d8a696f738c998ec4e19ce99a5fec2428b9f5f21..05fac1f38b50e8515022959e0b3cb143c311a556 100644 (file)
@@ -18,8 +18,8 @@
 
 #include <unistd.h>
 
-#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);
index b990df15dc8adbcc4fd2aa446b6d2a50eacbce89..8e4177f154990ce3905be2e95b1c71106975cfc2 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "network.h"
 #include "istream.h"
+#include "master-service.h"
 #include "doveadm.h"
 
 #include <stdio.h>
@@ -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);
        }
index 48a087cc354db916b52456f64999f2c3b8a93b55..6ce16650509d9b2f48717f2e0aef3d2e7e107fb5 100644 (file)
@@ -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;
+}
index 16e08f5ed30044716afd89f750756247424bffe2..cc5a8c3c1ed9ac3d8b92b2bec4220d6c99977d82 100644 (file)
@@ -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 <tab> service_name <tab> major version <tab> minor version */
+bool version_string_verify(const char *line, const char *service_name,
+                          unsigned major_version);
+
 #endif