1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright 2014 Kay Sievers, Lennart Poettering
6 #include "alloc-util.h"
8 #include "dns-domain.h"
9 #include "extract-word.h"
10 #include "string-util.h"
11 #include "timesyncd-conf.h"
12 #include "timesyncd-manager.h"
13 #include "timesyncd-server.h"
15 int manager_parse_server_string(Manager
*m
, ServerType type
, const char *string
) {
22 first
= type
== SERVER_FALLBACK
? m
->fallback_servers
: m
->system_servers
;
24 if (type
== SERVER_FALLBACK
)
25 m
->have_fallbacks
= true;
28 _cleanup_free_
char *word
= NULL
;
32 r
= extract_first_word(&string
, &word
, NULL
, 0);
34 return log_error_errno(r
, "Failed to parse timesyncd server syntax \"%s\": %m", string
);
38 r
= dns_name_is_valid_or_address(word
);
40 return log_error_errno(r
, "Failed to check validity of NTP server name or address '%s': %m", word
);
42 log_error("Invalid NTP server name or address, ignoring: %s", word
);
46 /* Filter out duplicates */
47 LIST_FOREACH(names
, n
, first
)
48 if (streq_ptr(n
->string
, word
)) {
56 r
= server_name_new(m
, NULL
, type
, word
);
64 int manager_parse_fallback_string(Manager
*m
, const char *string
) {
65 if (m
->have_fallbacks
)
68 return manager_parse_server_string(m
, SERVER_FALLBACK
, string
);
71 int config_parse_servers(
76 unsigned section_line
,
83 Manager
*m
= userdata
;
91 manager_flush_server_names(m
, ltype
);
93 r
= manager_parse_server_string(m
, ltype
, rvalue
);
95 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Failed to parse NTP server string '%s'. Ignoring.", rvalue
);
103 int manager_parse_config_file(Manager
*m
) {
108 r
= config_parse_many_nulstr(PKGSYSCONFDIR
"/timesyncd.conf",
109 CONF_PATHS_NULSTR("systemd/timesyncd.conf.d"),
111 config_item_perf_lookup
, timesyncd_gperf_lookup
,
112 CONFIG_PARSE_WARN
, m
);
116 if (m
->poll_interval_min_usec
< 16 * USEC_PER_SEC
) {
117 log_warning("Invalid PollIntervalMinSec=. Using default value.");
118 m
->poll_interval_min_usec
= NTP_POLL_INTERVAL_MIN_USEC
;
121 if (m
->poll_interval_max_usec
< m
->poll_interval_min_usec
) {
122 log_warning("PollIntervalMaxSec= is smaller than PollIntervalMinSec=. Using default value.");
123 m
->poll_interval_max_usec
= MAX(NTP_POLL_INTERVAL_MAX_USEC
, m
->poll_interval_min_usec
* 32);