#include "connection.h"
#include "str.h"
#include "strescape.h"
+#include "version.h"
#include "master-service.h"
#include "master-interface.h"
#include "connect-limit.h"
#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"
#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"
#include "default-settings-import.h"
+#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#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"
#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"
#include "hash.h"
#include "strescape.h"
#include "time-util.h"
-#include "master-service.h"
+#include "version.h"
#include "doveadm.h"
#include "doveadm-print.h"
#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"
#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"
#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"
#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"
#include "ioloop.h"
#include "istream.h"
#include "ostream.h"
-#include "master-service.h"
+#include "version.h"
#include "auth-client.h"
#include "client-common.h"
#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"
#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"
test_programs = \
test-event-stats \
- test-master-service \
test-master-service-settings
noinst_PROGRAMS = $(test_programs)
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)
#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"
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)
{
*/
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);
uri-util.c \
utc-offset.c \
utc-mktime.c \
+ version.c \
wildcard-match.c \
write-full.c
uri-util.h \
utc-offset.h \
utc-mktime.h \
+ version.h \
wildcard-match.h \
write-full.h
test-unicode-casemap.c \
test-utc-mktime.c \
test-uri.c \
+ test-version.c \
test-wildcard-match.c
test_headers = \
TEST(test_unicode_casemap)
TEST(test_uri)
TEST(test_utc_mktime)
+TEST(test_version)
TEST(test_wildcard_match)
-/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */
+/* Copyright (c) 2023-2025 Dovecot authors, see the included COPYING file */
-#include "lib.h"
-#include "master-service.h"
+#include "test-lib.h"
+#include "version.h"
#include "test-common.h"
static void test_version_is_valid(void)
test_end();
}
-int main(void)
+void test_version(void)
{
- static void (*const test_functions[])(void) = {
- test_version_is_valid,
- test_version_cmp,
- NULL
- };
- return test_run(test_functions);
+ test_version_is_valid();
+ test_version_cmp();
}
--- /dev/null
+/* 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;
+}
+
--- /dev/null
+#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
#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"
#include "execv-const.h"
#include "write-full.h"
#include "restrict-access.h"
+#include "version.h"
#include "master-interface.h"
#include "master-service.h"