84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering/***
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering This file is part of systemd.
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering Copyright 2014 Kay Sievers, Lennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering systemd is free software; you can redistribute it and/or modify it
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering under the terms of the GNU Lesser General Public License as published by
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering (at your option) any later version.
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering systemd is distributed in the hope that it will be useful, but
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering Lesser General Public License for more details.
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering You should have received a copy of the GNU Lesser General Public License
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering***/
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "alloc-util.h"
a0f29c767a3bb3d621c658fa5b87063e1f44e24aLennart Poettering#include "def.h"
a0f29c767a3bb3d621c658fa5b87063e1f44e24aLennart Poettering#include "extract-word.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "string-util.h"
a0f29c767a3bb3d621c658fa5b87063e1f44e24aLennart Poettering#include "timesyncd-conf.h"
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering#include "timesyncd-manager.h"
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering#include "timesyncd-server.h"
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poetteringint manager_parse_server_string(Manager *m, ServerType type, const char *string) {
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering ServerName *first;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering int r;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering assert(m);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering assert(string);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering first = type == SERVER_FALLBACK ? m->fallback_servers : m->system_servers;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani for (;;) {
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering _cleanup_free_ char *word = NULL;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering bool found = false;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering ServerName *n;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani r = extract_first_word(&string, &word, NULL, 0);
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani if (r < 0)
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani return log_error_errno(r, "Failed to parse timesyncd server syntax \"%s\": %m", string);
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani if (r == 0)
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani break;
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering /* Filter out duplicates */
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering LIST_FOREACH(names, n, first)
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani if (streq_ptr(n->string, word)) {
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering found = true;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering break;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering }
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering if (found)
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering continue;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
2e3c585472540d69a1f4f2023bc5ed67bad8bdb2Susant Sahani r = server_name_new(m, NULL, type, word);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering if (r < 0)
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering return r;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering }
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering return 0;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering}
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poetteringint config_parse_servers(
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering const char *unit,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering const char *filename,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering unsigned line,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering const char *section,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering unsigned section_line,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering const char *lvalue,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering int ltype,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering const char *rvalue,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering void *data,
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering void *userdata) {
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering Manager *m = userdata;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering int r;
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering assert(filename);
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering assert(lvalue);
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering assert(rvalue);
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering if (isempty(rvalue))
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering manager_flush_server_names(m, ltype);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering else {
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering r = manager_parse_server_string(m, ltype, rvalue);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering if (r < 0) {
12ca818ffddb77eb6a0fabe369a5bcbf6994ff8bLennart Poettering log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse NTP server string '%s'. Ignoring.", rvalue);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering return 0;
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering }
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering }
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering return 0;
84e51726a38e133ca42d2f30f0668d3921b210cbLennart Poettering}
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poetteringint manager_parse_config_file(Manager *m) {
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering assert(m);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering
75eb615480afd787fa412f0a529523f568f79b26Lennart Poettering return config_parse_many(PKGSYSCONFDIR "/timesyncd.conf",
75eb615480afd787fa412f0a529523f568f79b26Lennart Poettering CONF_PATHS_NULSTR("systemd/timesyncd.conf.d"),
be795898c0d2fa21e3389b89793dcd45c47f8b9fJosh Triplett "Time\0",
be795898c0d2fa21e3389b89793dcd45c47f8b9fJosh Triplett config_item_perf_lookup, timesyncd_gperf_lookup,
be795898c0d2fa21e3389b89793dcd45c47f8b9fJosh Triplett false, m);
874ff7bf4d6fe693542209f127d23cd89adc499bLennart Poettering}