X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimesync%2Ftimesyncd-conf.c;h=be1f4bb1510fc28114513b144b356c006a45f9bf;hb=b02cb41c78c61c27bf1432e19f241a3c3d47a419;hp=5ec907bb41d2c100b669cfb51ddf87114cf55823;hpb=84e51726a38e133ca42d2f30f0668d3921b210cb;p=elogind.git diff --git a/src/timesync/timesyncd-conf.c b/src/timesync/timesyncd-conf.c index 5ec907bb4..be1f4bb15 100644 --- a/src/timesync/timesyncd-conf.c +++ b/src/timesync/timesyncd-conf.c @@ -19,9 +19,49 @@ along with systemd; If not, see . ***/ +#include "in-addr-util.h" + #include "timesyncd-manager.h" +#include "timesyncd-server.h" #include "timesyncd-conf.h" +int manager_parse_server_string(Manager *m, ServerType type, const char *string) { + const char *word, *state; + size_t length; + ServerName *first; + int r; + + assert(m); + assert(string); + + first = type == SERVER_FALLBACK ? m->fallback_servers : m->system_servers; + + FOREACH_WORD_QUOTED(word, length, string, state) { + char buffer[length+1]; + bool found = false; + ServerName *n; + + memcpy(buffer, word, length); + buffer[length] = 0; + + /* Filter out duplicates */ + LIST_FOREACH(names, n, first) + if (streq_ptr(n->string, buffer)) { + found = true; + break; + } + + if (found) + continue; + + r = server_name_new(m, NULL, type, buffer); + if (r < 0) + return r; + } + + return 0; +} + int config_parse_servers( const char *unit, const char *filename, @@ -35,15 +75,31 @@ int config_parse_servers( void *userdata) { Manager *m = userdata; + int r; assert(filename); assert(lvalue); assert(rvalue); if (isempty(rvalue)) - manager_flush_names(m); - - manager_add_server_string(m, rvalue); + manager_flush_server_names(m, ltype); + else { + r = manager_parse_server_string(m, ltype, rvalue); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, -r, "Failed to parse NTP server string '%s'. Ignoring.", rvalue); + return 0; + } + } return 0; } + +int manager_parse_config_file(Manager *m) { + assert(m); + + return config_parse_many("/etc/systemd/timesyncd.conf", + CONF_DIRS_NULSTR("systemd/timesyncd.conf"), + "Time\0", + config_item_perf_lookup, timesyncd_gperf_lookup, + false, m); +}