diff options
author | Kay Sievers <kay@vrfy.org> | 2014-07-09 14:29:20 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2014-07-09 17:04:11 +0200 |
commit | b72ddf0f4f552dd53d6404b6ddbc9f17d02b8e12 (patch) | |
tree | f5eb9c3baab0178f1f3b587de273a40cea5374d5 /src/timedate/timedated.c | |
parent | efab8d0b0ebf6d715949b7af66fecaf5e5e5d77b (diff) | |
download | systemd-b72ddf0f4f552dd53d6404b6ddbc9f17d02b8e12.tar.gz |
timedated: manage systemd-timesyncd directly instead of lists of alternatives
Alternative NTP implementations should add a:
Conflicts=systemd-timesyncd.service
to take over the built-in NTP functionality of systemd.
Diffstat (limited to 'src/timedate/timedated.c')
-rw-r--r-- | src/timedate/timedated.c | 254 |
1 files changed, 94 insertions, 160 deletions
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 5d3b8c41e6..936a902be6 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -180,211 +180,145 @@ static int context_write_data_local_rtc(Context *c) { return write_string_file_atomic_label("/etc/adjtime", w); } -static char** get_ntp_services(void) { - _cleanup_strv_free_ char **r = NULL, **files = NULL; - char **i; - int k; - - k = conf_files_list(&files, ".list", NULL, - "/etc/systemd/ntp-units.d", - "/run/systemd/ntp-units.d", - "/usr/local/lib/systemd/ntp-units.d", - "/usr/lib/systemd/ntp-units.d", - NULL); - if (k < 0) - return NULL; - - STRV_FOREACH(i, files) { - _cleanup_fclose_ FILE *f; - - f = fopen(*i, "re"); - if (!f) - continue; - - for (;;) { - char line[PATH_MAX], *l; - - if (!fgets(line, sizeof(line), f)) { - if (ferror(f)) - log_error("Failed to read NTP unit file: %m"); - - break; - } - - l = strstrip(line); - if (l[0] == 0 || l[0] == '#') - continue; - - if (strv_extend(&r, l) < 0) { - log_oom(); - return NULL; - } - } - } - - i = r; - r = NULL; /* avoid cleanup */ - - return strv_uniq(i); -} - static int context_read_ntp(Context *c, sd_bus *bus) { - _cleanup_strv_free_ char **l; - char **i; + _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + sd_bus_message *reply = NULL; + const char *s; int r; assert(c); assert(bus); - l = get_ntp_services(); - STRV_FOREACH(i, l) { - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - sd_bus_message *reply = NULL; - const char *s; - - r = sd_bus_call_method( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "GetUnitFileState", - &error, - &reply, - "s", - *i); - - if (r < 0) { - /* This implementation does not exist. Try the next one. */ - if (sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND)) - continue; + r = sd_bus_call_method( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnitFileState", + &error, + &reply, + "s", + "systemd-timesyncd.service"); - return r; - } + if (r < 0) { + if (sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND) || + sd_bus_error_has_name(&error, "org.freedesktop.systemd1.LoadFailed") || + sd_bus_error_has_name(&error, "org.freedesktop.systemd1.NoSuchUnit")) + return 0; - r = sd_bus_message_read(reply, "s", &s); - if (r < 0) - return r; + return r; + } - c->can_ntp = true; - c->use_ntp = STR_IN_SET(s, "enabled", "enabled-runtime"); + r = sd_bus_message_read(reply, "s", &s); + if (r < 0) + return r; - return 0; - } + c->can_ntp = true; + c->use_ntp = STR_IN_SET(s, "enabled", "enabled-runtime"); return 0; } static int context_start_ntp(Context *c, sd_bus *bus, sd_bus_error *error) { - _cleanup_strv_free_ char **l = NULL; - char **i; int r; assert(c); assert(bus); assert(error); - l = get_ntp_services(); - STRV_FOREACH(i, l) { - - if (c->use_ntp) - r = sd_bus_call_method( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "StartUnit", - error, - NULL, - "ss", *i, "replace"); - else - r = sd_bus_call_method( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "StopUnit", - error, - NULL, - "ss", *i, "replace"); - - if (r < 0) { - if (sd_bus_error_has_name(error, SD_BUS_ERROR_FILE_NOT_FOUND) || - sd_bus_error_has_name(error, "org.freedesktop.systemd1.LoadFailed") || - sd_bus_error_has_name(error, "org.freedesktop.systemd1.NoSuchUnit")) { - /* This implementation does not exist. Try the next one. */ - sd_bus_error_free(error); - continue; - } + if (c->use_ntp) + r = sd_bus_call_method( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "StartUnit", + error, + NULL, + "ss", + "systemd-timesyncd.service", + "replace"); + else + r = sd_bus_call_method( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "StopUnit", + error, + NULL, + "ss", + "systemd-timesyncd.service", + "replace"); - return r; + if (r < 0) { + if (sd_bus_error_has_name(error, SD_BUS_ERROR_FILE_NOT_FOUND) || + sd_bus_error_has_name(error, "org.freedesktop.systemd1.LoadFailed") || + sd_bus_error_has_name(error, "org.freedesktop.systemd1.NoSuchUnit")) { + sd_bus_error_set_const(error, "org.freedesktop.timedate1.NoNTPSupport", "NTP not supported."); + return -ENOTSUP; } - return 1; + return r; } - sd_bus_error_set_const(error, "org.freedesktop.timedate1.NoNTPSupport", "NTP not supported."); - return -ENOTSUP; + return 0; } static int context_enable_ntp(Context*c, sd_bus *bus, sd_bus_error *error) { - _cleanup_strv_free_ char **l = NULL; - char **i; int r; assert(c); assert(bus); assert(error); - l = get_ntp_services(); - STRV_FOREACH(i, l) { - if (c->use_ntp) - r = sd_bus_call_method( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "EnableUnitFiles", - error, - NULL, - "asbb", 1, *i, false, true); - else - r = sd_bus_call_method( - bus, - "org.freedesktop.systemd1", - "/org/freedesktop/systemd1", - "org.freedesktop.systemd1.Manager", - "DisableUnitFiles", - error, - NULL, - "asb", 1, *i, false); - - if (r < 0) { - if (sd_bus_error_has_name(error, SD_BUS_ERROR_FILE_NOT_FOUND)) { - /* This implementation does not exist. Try the next one. */ - sd_bus_error_free(error); - continue; - } - - return r; - } - + if (c->use_ntp) r = sd_bus_call_method( bus, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "Reload", + "EnableUnitFiles", error, NULL, - NULL); - if (r < 0) - return r; + "asbb", 1, + "systemd-timesyncd.service", + false, true); + else + r = sd_bus_call_method( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "DisableUnitFiles", + error, + NULL, + "asb", 1, + "systemd-timesyncd.service", + false); - return 1; + if (r < 0) { + if (sd_bus_error_has_name(error, SD_BUS_ERROR_FILE_NOT_FOUND)) { + sd_bus_error_set_const(error, "org.freedesktop.timedate1.NoNTPSupport", "NTP not supported."); + return -ENOTSUP; + } + + return r; } - sd_bus_error_set_const(error, "org.freedesktop.timedate1.NoNTPSupport", "NTP not supported."); - return -ENOTSUP; + r = sd_bus_call_method( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "Reload", + error, + NULL, + NULL); + if (r < 0) + return r; + + return 0; } static int property_get_rtc_time( |