From: Timo Sirainen Date: Sun, 5 Oct 2025 15:49:13 +0000 (+0300) Subject: [PATCH 11/12] lib, lib-master: Move version_*() to lib/version.[ch] X-Git-Tag: archive/raspbian/1%2.4.1+dfsg1-6+rpi1+deb13u7^2~30 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=66d2b119478614caf01aea554e4911492017684c;p=dovecot.git [PATCH 11/12] lib, lib-master: Move version_*() to lib/version.[ch] Gbp-Pq: Name 0011-lib-lib-master-Move-version_-to-lib-version.-ch.patch --- diff --git a/src/anvil/anvil-connection.c b/src/anvil/anvil-connection.c index 13c57bf..9cd4456 100644 --- a/src/anvil/anvil-connection.c +++ b/src/anvil/anvil-connection.c @@ -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" diff --git a/src/config/config-connection.c b/src/config/config-connection.c index d9e0a13..265c702 100644 --- a/src/config/config-connection.c +++ b/src/config/config-connection.c @@ -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" diff --git a/src/config/config-parser.c b/src/config/config-parser.c index 61dbeba..dbbe91e 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -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 #include #include #include diff --git a/src/config/old-set-parser.c b/src/config/old-set-parser.c index 4ae8506..ee2cb51 100644 --- a/src/config/old-set-parser.c +++ b/src/config/old-set-parser.c @@ -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" diff --git a/src/doveadm/client-connection-tcp.c b/src/doveadm/client-connection-tcp.c index a6c39b9..cb16f72 100644 --- a/src/doveadm/client-connection-tcp.c +++ b/src/doveadm/client-connection-tcp.c @@ -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" diff --git a/src/doveadm/doveadm-penalty.c b/src/doveadm/doveadm-penalty.c index 8a098b3..71a997e 100644 --- a/src/doveadm/doveadm-penalty.c +++ b/src/doveadm/doveadm-penalty.c @@ -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" diff --git a/src/doveadm/doveadm-stats.c b/src/doveadm/doveadm-stats.c index bd75522..87aef26 100644 --- a/src/doveadm/doveadm-stats.c +++ b/src/doveadm/doveadm-stats.c @@ -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" diff --git a/src/doveadm/doveadm-util.c b/src/doveadm/doveadm-util.c index c21dbee..4bea243 100644 --- a/src/doveadm/doveadm-util.c +++ b/src/doveadm/doveadm-util.c @@ -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" diff --git a/src/doveadm/doveadm-who.c b/src/doveadm/doveadm-who.c index ecdbb88..29172af 100644 --- a/src/doveadm/doveadm-who.c +++ b/src/doveadm/doveadm-who.c @@ -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" diff --git a/src/doveadm/dsync/dsync-ibc-stream.c b/src/doveadm/dsync/dsync-ibc-stream.c index 957c569..472d1fc 100644 --- a/src/doveadm/dsync/dsync-ibc-stream.c +++ b/src/doveadm/dsync/dsync-ibc-stream.c @@ -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" diff --git a/src/imap-urlauth-login/imap-urlauth-login.c b/src/imap-urlauth-login/imap-urlauth-login.c index 23a76f6..68b4aab 100644 --- a/src/imap-urlauth-login/imap-urlauth-login.c +++ b/src/imap-urlauth-login/imap-urlauth-login.c @@ -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" diff --git a/src/imap/imap-client-hibernate.c b/src/imap/imap-client-hibernate.c index ade5d25..067b984 100644 --- a/src/imap/imap-client-hibernate.c +++ b/src/imap/imap-client-hibernate.c @@ -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" diff --git a/src/lib-doveadm/doveadm-client.c b/src/lib-doveadm/doveadm-client.c index 47b09f6..6d57016 100644 --- a/src/lib-doveadm/doveadm-client.c +++ b/src/lib-doveadm/doveadm-client.c @@ -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" diff --git a/src/lib-master/Makefile.am b/src/lib-master/Makefile.am index d6fe251..8939f75 100644 --- a/src/lib-master/Makefile.am +++ b/src/lib-master/Makefile.am @@ -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) diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 71438c0..4194c19 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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" diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index a18cb39..8f2ccac 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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) { diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 1dca3a6..6c13dda 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -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 service_name major version 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 index f30b250..0000000 --- a/src/lib-master/test-master-service.c +++ /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); -} diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index eb9b9dd..45a4f11 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -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 = \ diff --git a/src/lib/test-lib.inc b/src/lib/test-lib.inc index 2fceca2..52259e4 100644 --- a/src/lib/test-lib.inc +++ b/src/lib/test-lib.inc @@ -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 index 0000000..e938333 --- /dev/null +++ b/src/lib/test-version.c @@ -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 index 0000000..f8bec42 --- /dev/null +++ b/src/lib/version.c @@ -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 index 0000000..f305f7f --- /dev/null +++ b/src/lib/version.h @@ -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 service_name major version 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 diff --git a/src/util/script-login.c b/src/util/script-login.c index ed35674..4df7f23 100644 --- a/src/util/script-login.c +++ b/src/util/script-login.c @@ -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" diff --git a/src/util/script.c b/src/util/script.c index 5838cda..391b87b 100644 --- a/src/util/script.c +++ b/src/util/script.c @@ -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"