]> dgit.raspbian.org Git - dovecot.git/commitdiff
[PATCH 11/12] lib, lib-master: Move version_*() to lib/version.[ch]
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 5 Oct 2025 15:49:13 +0000 (18:49 +0300)
committerNoah Meyerhans <noahm@debian.org>
Wed, 16 Sep 2026 19:06:35 +0000 (15:06 -0400)
Gbp-Pq: Name 0011-lib-lib-master-Move-version_-to-lib-version.-ch.patch

25 files changed:
src/anvil/anvil-connection.c
src/config/config-connection.c
src/config/config-parser.c
src/config/old-set-parser.c
src/doveadm/client-connection-tcp.c
src/doveadm/doveadm-penalty.c
src/doveadm/doveadm-stats.c
src/doveadm/doveadm-util.c
src/doveadm/doveadm-who.c
src/doveadm/dsync/dsync-ibc-stream.c
src/imap-urlauth-login/imap-urlauth-login.c
src/imap/imap-client-hibernate.c
src/lib-doveadm/doveadm-client.c
src/lib-master/Makefile.am
src/lib-master/master-service-settings.c
src/lib-master/master-service.c
src/lib-master/master-service.h
src/lib-master/test-master-service.c [deleted file]
src/lib/Makefile.am
src/lib/test-lib.inc
src/lib/test-version.c [new file with mode: 0644]
src/lib/version.c [new file with mode: 0644]
src/lib/version.h [new file with mode: 0644]
src/util/script-login.c
src/util/script.c

index 13c57bf3e7eeb74630c4f8f552140402da1031f6..9cd44563edd0d6a695e57ab5d74cb20991213d01 100644 (file)
@@ -11,6 +11,7 @@
 #include "connection.h"
 #include "str.h"
 #include "strescape.h"
+#include "version.h"
 #include "master-service.h"
 #include "master-interface.h"
 #include "connect-limit.h"
index d9e0a1320708f235e8f480cf9ddf66fe45d65366..265c702601bfcfc06b0bfd727fceb1c977b999e2 100644 (file)
@@ -7,6 +7,7 @@
 #include "ostream.h"
 #include "ostream-unix.h"
 #include "strescape.h"
+#include "version.h"
 #include "settings-parser.h"
 #include "master-service.h"
 #include "master-service-settings.h"
index 61dbebabacff4688b92a7310bc881a6f5e6486c4..dbbe91ed9969e1093370ea5b40add3edbe0bf3e2 100644 (file)
@@ -9,9 +9,9 @@
 #include "strescape.h"
 #include "istream.h"
 #include "module-dir.h"
+#include "version.h"
 #include "settings.h"
 #include "service-settings.h"
-#include "master-service.h"
 #include "master-service-settings.h"
 #include "all-settings.h"
 #include "old-set-parser.h"
@@ -22,6 +22,7 @@
 
 #include "default-settings-import.h"
 
+#include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <time.h>
index 4ae8506dc71bf53232645df41be755c4bc715c92..ee2cb513c99fd821e4908a8474df8f614daf4a5a 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
-#include "master-service.h"
+#include "version.h"
 #include "settings-history.h"
 #include "config-parser-private.h"
 #include "old-set-parser.h"
index a6c39b9b3814d0c6a3b9a9fe63b425062e638770..cb16f7214b43795fff26c2cdfa358f6cd937962d 100644 (file)
@@ -8,9 +8,9 @@
 #include "istream.h"
 #include "ostream.h"
 #include "strescape.h"
+#include "version.h"
 #include "iostream-ssl.h"
 #include "ostream-multiplex.h"
-#include "master-service.h"
 #include "master-service-ssl.h"
 #include "mail-storage-service.h"
 #include "doveadm-util.h"
index 8a098b3453e6776f37333d570cb5969f688e332f..71a997e2e882f677defc37222574f5217271e364 100644 (file)
@@ -7,7 +7,7 @@
 #include "hash.h"
 #include "strescape.h"
 #include "time-util.h"
-#include "master-service.h"
+#include "version.h"
 #include "doveadm.h"
 #include "doveadm-print.h"
 
index bd7552211adfdb1df1cee5756eeaa8b8d4679776..87aef26a89412a0c4df05e0a675272078cdf620c 100644 (file)
@@ -6,7 +6,7 @@
 #include "str.h"
 #include "strescape.h"
 #include "write-full.h"
-#include "master-service.h"
+#include "version.h"
 #include "doveadm.h"
 #include "doveadm-print.h"
 #include "stats-settings.h"
index c21dbee6c0e8b904dde99f52f358e76a25243e72..4bea2437cc4ab20286d4cb6f3b219f13c054151d 100644 (file)
@@ -7,6 +7,7 @@
 #include "ostream.h"
 #include "net.h"
 #include "time-util.h"
+#include "version.h"
 #include "master-service.h"
 #include "module-dir.h"
 #include "doveadm-settings.h"
index ecdbb88bc793423343297fdeb616e62b288f131e..29172afba03ad73625d317f7ae163ac72308288a 100644 (file)
@@ -8,7 +8,7 @@
 #include "hash.h"
 #include "str.h"
 #include "strescape.h"
-#include "master-service.h"
+#include "version.h"
 #include "doveadm.h"
 #include "doveadm-print.h"
 #include "doveadm-who.h"
index 957c569cee9b5f0e1f81afdc786e331ad51f1dc9..472d1fc5171110bbda6e50debd326d8921ade7f3 100644 (file)
@@ -10,7 +10,7 @@
 #include "ostream.h"
 #include "str.h"
 #include "strescape.h"
-#include "master-service.h"
+#include "version.h"
 #include "mail-cache.h"
 #include "mail-storage-private.h"
 #include "dsync-serializer.h"
index 23a76f6c81d0afdc7d3259ee6754b674ab1bcac0..68b4aab159fe8b9e7b8a92b5dbd56c1ce1ea998a 100644 (file)
@@ -8,7 +8,7 @@
 #include "ioloop.h"
 #include "istream.h"
 #include "ostream.h"
-#include "master-service.h"
+#include "version.h"
 #include "auth-client.h"
 #include "client-common.h"
 
index ade5d250ead2415cc886ca2550244b9601841edb..067b984cc04e9da40fe67168bc16b3c76ff32028 100644 (file)
@@ -9,7 +9,7 @@
 #include "base64.h"
 #include "str.h"
 #include "strescape.h"
-#include "master-service.h"
+#include "version.h"
 #include "compression.h"
 #include "mailbox-watch.h"
 #include "imap-state.h"
index 47b09f677f6471ed922a846a2ceb0045b1d3ea42..6d570169ec992d7de68319312a0067f8a33188fb 100644 (file)
@@ -10,8 +10,8 @@
 #include "ostream-dot.h"
 #include "str.h"
 #include "strescape.h"
+#include "version.h"
 #include "iostream-ssl.h"
-#include "master-service.h"
 #include "doveadm-protocol.h"
 #include "doveadm-client.h"
 #include "dns-lookup.h"
index d6fe251e43e870b543401c26253825e73cadbb16..8939f759de004939b0516d54a59a7dc86834e11a 100644 (file)
@@ -47,7 +47,6 @@ pkginc_lib_HEADERS = $(headers)
 
 test_programs = \
        test-event-stats \
-       test-master-service \
        test-master-service-settings
 
 noinst_PROGRAMS = $(test_programs)
@@ -71,10 +70,6 @@ test_event_stats_SOURCES = test-event-stats.c
 test_event_stats_LDADD = $(test_libs)
 test_event_stats_DEPENDENCIES = $(test_deps)
 
-test_master_service_SOURCES = test-master-service.c
-test_master_service_LDADD = $(test_libs)
-test_master_service_DEPENDENCIES = $(test_deps)
-
 test_master_service_settings_SOURCES = test-master-service-settings.c
 test_master_service_settings_LDADD = $(test_libs)
 test_master_service_settings_DEPENDENCIES = $(test_deps)
index 71438c0c4f395f11998affbdc93ed525eac5eefa..4194c19fab7717ef9672009cec17f9475bf48e78 100644 (file)
@@ -11,6 +11,7 @@
 #include "eacces-error.h"
 #include "env-util.h"
 #include "execv-const.h"
+#include "version.h"
 #include "settings.h"
 #include "stats-client.h"
 #include "master-service-private.h"
index a18cb39dbe00607217b93feaec9a3f5800bf6cc8..8f2ccacee1678e3ea0fb4273ce7b10b4cd9d70bd 100644 (file)
@@ -2035,91 +2035,6 @@ void master_status_update(struct master_service *service)
        master_status_send(service, important_update);
 }
 
-bool version_string_verify(const char *line, const char *service_name,
-                          unsigned int major_version)
-{
-       unsigned int minor_version;
-
-       return version_string_verify_full(line, service_name,
-                                         major_version, &minor_version);
-}
-
-bool version_string_verify_full(const char *line, const char *service_name,
-                               unsigned int major_version,
-                               unsigned int *minor_version_r)
-{
-       size_t service_name_len = strlen(service_name);
-       bool ret;
-
-       if (!str_begins(line, "VERSION\t", &line))
-               return FALSE;
-
-       if (strncmp(line, service_name, service_name_len) != 0 ||
-           line[service_name_len] != '\t')
-               return FALSE;
-       line += service_name_len + 1;
-
-       T_BEGIN {
-               const char *p = strchr(line, '\t');
-
-               if (p == NULL)
-                       ret = FALSE;
-               else {
-                       ret = str_uint_equals(t_strdup_until(line, p),
-                                             major_version);
-                       if (str_to_uint(p+1, minor_version_r) < 0)
-                               ret = FALSE;
-               }
-       } T_END;
-       return ret;
-}
-
-int version_cmp(const char *version1, const char *version2)
-{
-       unsigned int v1, v2;
-
-       do {
-               if (str_parse_uint(version1, &v1, &version1) < 0)
-                       i_unreached();
-               if (str_parse_uint(version2, &v2, &version2) < 0)
-                       i_unreached();
-               if (*version1 == '.')
-                       version1++;
-               else
-                       i_assert(*version1 == '\0');
-               if (*version2 == '.')
-                       version2++;
-               else
-                       i_assert(*version2 == '\0');
-
-               if (v1 < v2)
-                       return -1;
-               if (v1 > v2)
-                       return 1;
-       } while (*version1 != '\0' && *version2 != '\0');
-
-       if (*version1 != '\0')
-               return 1;
-       if (*version2 != '\0')
-               return -1;
-       return 0;
-}
-
-bool version_is_valid(const char *version)
-{
-       unsigned int i;
-
-       for (i = 0; version[i] != '\0'; i++) {
-               if (version[i] == '.') {
-                       if (i == 0 || version[i-1] == '.' ||
-                           version[i+1] == '\0')
-                               return FALSE;
-               } else if (version[i] < '0' || version[i] > '9')
-                       return FALSE;
-       }
-       return i > 0;
-}
-
 void master_service_set_process_shutdown_filter(struct master_service *service,
                                                struct event_filter *filter)
 {
index 1dca3a6403bf0bdabf4e42801dc9294fc4b55289..6c13ddaca7b307a27333d39b37b0959bd0f67cdd 100644 (file)
@@ -308,21 +308,6 @@ void master_service_deinit(struct master_service **service);
  */
 void master_service_deinit_forked(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 int major_version);
-/* Same as version_string_verify(), but return the minor version. */
-bool version_string_verify_full(const char *line, const char *service_name,
-                               unsigned int major_version,
-                               unsigned int *minor_version_r);
-/* Compare number[.number[...]] style version numbers. Assert-crash if the
-   version strings are invalid. */
-int version_cmp(const char *version1, const char *version2);
-/* Returns TRUE if version string is a valid number[.number[...]] string. */
-bool version_is_valid(const char *version);
-
 /* Sets process shutdown filter */
 void master_service_set_process_shutdown_filter(struct master_service *service,
                                                struct event_filter *filter);
diff --git a/src/lib-master/test-master-service.c b/src/lib-master/test-master-service.c
deleted file mode 100644 (file)
index f30b250..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */
-
-#include "lib.h"
-#include "master-service.h"
-#include "test-common.h"
-
-static void test_version_is_valid(void)
-{
-       test_begin("version_is_valid");
-
-       test_assert(version_is_valid("1"));
-       test_assert(version_is_valid("1.0"));
-       test_assert(version_is_valid("1.0.2"));
-       test_assert(version_is_valid("999.88.77777.6666666.55"));
-
-       test_assert(!version_is_valid(""));
-       test_assert(!version_is_valid("."));
-       test_assert(!version_is_valid("1."));
-       test_assert(!version_is_valid(".1"));
-       test_assert(!version_is_valid("1..0"));
-       test_assert(!version_is_valid("1.0."));
-       test_assert(!version_is_valid("1.0.."));
-       test_assert(!version_is_valid("v"));
-       test_assert(!version_is_valid("v1"));
-       test_assert(!version_is_valid("1v"));
-       test_assert(!version_is_valid("1.v"));
-       test_assert(!version_is_valid("1.0v"));
-
-       test_end();
-}
-
-static void test_version_cmp(void)
-{
-       static const struct {
-               const char *v1, *v2;
-               int ret;
-       } tests[] = {
-               { "1", "1", 0 },
-               { "1.2.3", "1.2.3", 0 },
-               { "1", "2", -1 },
-               { "1.1", "2", -1 },
-               { "1.1", "1", 1 },
-               { "1.1", "1.0", 1 },
-               { "1.1", "1.0.0", 1 },
-               { "1.1", "1.0.9", 1 },
-               { "3.0.0", "3.0.9.4", -1 },
-               { "3.1.0", "3.0.9.4", 1 },
-               { NULL, NULL, 0 },
-       };
-
-       test_begin("version_cmp");
-       for (unsigned int i = 0; tests[i].v1 != NULL; i++) {
-               test_assert_idx(version_cmp(tests[i].v1, tests[i].v2) == tests[i].ret, i);
-               test_assert_idx(version_cmp(tests[i].v2, tests[i].v1) == -tests[i].ret, i);
-       }
-       test_end();
-}
-
-int main(void)
-{
-       static void (*const test_functions[])(void) = {
-               test_version_is_valid,
-               test_version_cmp,
-               NULL
-       };
-       return test_run(test_functions);
-}
index eb9b9ddda3afb76c716b212ad016f3a245c91a8c..45a4f1160e7948c0d31dcc3ded1e4dd89b2df5ce 100644 (file)
@@ -197,6 +197,7 @@ liblib_la_SOURCES = \
        uri-util.c \
        utc-offset.c \
        utc-mktime.c \
+       version.c \
        wildcard-match.c \
        write-full.c
 
@@ -358,6 +359,7 @@ headers = \
        uri-util.h \
        utc-offset.h \
        utc-mktime.h \
+       version.h \
        wildcard-match.h \
        write-full.h
 
@@ -464,6 +466,7 @@ test_lib_SOURCES = \
        test-unichar.c \
        test-utc-mktime.c \
        test-uri.c \
+       test-version.c \
        test-wildcard-match.c
 
 test_headers = \
index 2fceca2f9bccaf4a63c1e2dd90c024af59fe2295..52259e4b962fb74c5f73ce4863a708d98acd0090 100644 (file)
@@ -109,4 +109,5 @@ TEST(test_time_util)
 TEST(test_unichar)
 TEST(test_uri)
 TEST(test_utc_mktime)
+TEST(test_version)
 TEST(test_wildcard_match)
diff --git a/src/lib/test-version.c b/src/lib/test-version.c
new file mode 100644 (file)
index 0000000..e938333
--- /dev/null
@@ -0,0 +1,63 @@
+/* Copyright (c) 2023-2025 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "version.h"
+#include "test-common.h"
+
+static void test_version_is_valid(void)
+{
+       test_begin("version_is_valid");
+
+       test_assert(version_is_valid("1"));
+       test_assert(version_is_valid("1.0"));
+       test_assert(version_is_valid("1.0.2"));
+       test_assert(version_is_valid("999.88.77777.6666666.55"));
+
+       test_assert(!version_is_valid(""));
+       test_assert(!version_is_valid("."));
+       test_assert(!version_is_valid("1."));
+       test_assert(!version_is_valid(".1"));
+       test_assert(!version_is_valid("1..0"));
+       test_assert(!version_is_valid("1.0."));
+       test_assert(!version_is_valid("1.0.."));
+       test_assert(!version_is_valid("v"));
+       test_assert(!version_is_valid("v1"));
+       test_assert(!version_is_valid("1v"));
+       test_assert(!version_is_valid("1.v"));
+       test_assert(!version_is_valid("1.0v"));
+
+       test_end();
+}
+
+static void test_version_cmp(void)
+{
+       static const struct {
+               const char *v1, *v2;
+               int ret;
+       } tests[] = {
+               { "1", "1", 0 },
+               { "1.2.3", "1.2.3", 0 },
+               { "1", "2", -1 },
+               { "1.1", "2", -1 },
+               { "1.1", "1", 1 },
+               { "1.1", "1.0", 1 },
+               { "1.1", "1.0.0", 1 },
+               { "1.1", "1.0.9", 1 },
+               { "3.0.0", "3.0.9.4", -1 },
+               { "3.1.0", "3.0.9.4", 1 },
+               { NULL, NULL, 0 },
+       };
+
+       test_begin("version_cmp");
+       for (unsigned int i = 0; tests[i].v1 != NULL; i++) {
+               test_assert_idx(version_cmp(tests[i].v1, tests[i].v2) == tests[i].ret, i);
+               test_assert_idx(version_cmp(tests[i].v2, tests[i].v1) == -tests[i].ret, i);
+       }
+       test_end();
+}
+
+void test_version(void)
+{
+       test_version_is_valid();
+       test_version_cmp();
+}
diff --git a/src/lib/version.c b/src/lib/version.c
new file mode 100644 (file)
index 0000000..f8bec42
--- /dev/null
@@ -0,0 +1,90 @@
+/* Copyright (c) 2005-2025 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "version.h"
+
+bool version_string_verify(const char *line, const char *service_name,
+                          unsigned int major_version)
+{
+       unsigned int minor_version;
+
+       return version_string_verify_full(line, service_name,
+                                         major_version, &minor_version);
+}
+
+bool version_string_verify_full(const char *line, const char *service_name,
+                               unsigned int major_version,
+                               unsigned int *minor_version_r)
+{
+       size_t service_name_len = strlen(service_name);
+       bool ret;
+
+       if (!str_begins(line, "VERSION\t", &line))
+               return FALSE;
+
+       if (strncmp(line, service_name, service_name_len) != 0 ||
+           line[service_name_len] != '\t')
+               return FALSE;
+       line += service_name_len + 1;
+
+       T_BEGIN {
+               const char *p = strchr(line, '\t');
+
+               if (p == NULL)
+                       ret = FALSE;
+               else {
+                       ret = str_uint_equals(t_strdup_until(line, p),
+                                             major_version);
+                       if (str_to_uint(p+1, minor_version_r) < 0)
+                               ret = FALSE;
+               }
+       } T_END;
+       return ret;
+}
+
+int version_cmp(const char *version1, const char *version2)
+{
+       unsigned int v1, v2;
+
+       do {
+               if (str_parse_uint(version1, &v1, &version1) < 0)
+                       i_unreached();
+               if (str_parse_uint(version2, &v2, &version2) < 0)
+                       i_unreached();
+               if (*version1 == '.')
+                       version1++;
+               else
+                       i_assert(*version1 == '\0');
+               if (*version2 == '.')
+                       version2++;
+               else
+                       i_assert(*version2 == '\0');
+
+               if (v1 < v2)
+                       return -1;
+               if (v1 > v2)
+                       return 1;
+       } while (*version1 != '\0' && *version2 != '\0');
+
+       if (*version1 != '\0')
+               return 1;
+       if (*version2 != '\0')
+               return -1;
+       return 0;
+}
+
+bool version_is_valid(const char *version)
+{
+       unsigned int i;
+
+       for (i = 0; version[i] != '\0'; i++) {
+               if (version[i] == '.') {
+                       if (i == 0 || version[i-1] == '.' ||
+                           version[i+1] == '\0')
+                               return FALSE;
+               } else if (version[i] < '0' || version[i] > '9')
+                       return FALSE;
+       }
+       return i > 0;
+}
+
diff --git a/src/lib/version.h b/src/lib/version.h
new file mode 100644 (file)
index 0000000..f305f7f
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef VERSION_H
+#define VERSION_H
+
+/* 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 int major_version);
+/* Same as version_string_verify(), but return the minor version. */
+bool version_string_verify_full(const char *line, const char *service_name,
+                               unsigned int major_version,
+                               unsigned int *minor_version_r);
+/* Compare number[.number[...]] style version numbers. Assert-crash if the
+   version strings are invalid. */
+int version_cmp(const char *version1, const char *version2);
+/* Returns TRUE if version string is a valid number[.number[...]] string. */
+bool version_is_valid(const char *version);
+
+#endif
index ed356747dc468fe8576805b9458817e85f8ff613..4df7f2317407785f56dfcdca5a69845e0781d7b3 100644 (file)
@@ -7,6 +7,7 @@
 #include "restrict-access.h"
 #include "str.h"
 #include "strescape.h"
+#include "version.h"
 #include "settings-parser.h"
 #include "mail-storage-service.h"
 #include "master-interface.h"
index 5838cdad31d0f00c755249c4845b898c0c8b6232..391b87bc0620cbea20fadeebdba9e9b7ecda0ecd 100644 (file)
@@ -8,6 +8,7 @@
 #include "execv-const.h"
 #include "write-full.h"
 #include "restrict-access.h"
+#include "version.h"
 #include "master-interface.h"
 #include "master-service.h"