X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedated.c;h=77534933c33b3aa50c3bfa0838e429803da0874d;hb=6ffe5e37c47c85f91bf6cc56bc3ff3cf60bffd15;hp=40ba25509059036ee359839da07a4da36f8ecd70;hpb=1ca6783f5ea3755bd83e723f529c2eda512c7fed;p=elogind.git diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 40ba25509..77534933c 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -35,6 +35,8 @@ #include "hwclock.h" #include "conf-files.h" #include "path-util.h" +#include "fileio-label.h" +#include "label.h" #define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n" #define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n" @@ -43,6 +45,7 @@ " \n" \ " \n" \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -82,10 +85,12 @@ const char timedate_interface[] _introspect_("timedate1") = INTERFACE; typedef struct TZ { char *zone; bool local_rtc; + int can_ntp; int use_ntp; } TZ; static TZ tz = { + .can_ntp = -1, .use_ntp = -1, }; @@ -176,14 +181,6 @@ static int read_data(void) { } } -#ifdef HAVE_DEBIAN - r = read_one_line_file("/etc/timezone", &tz.zone); - if (r < 0) { - if (r != -ENOENT) - log_warning("Failed to read /etc/timezone: %s", strerror(-r)); - } -#endif - have_timezone: if (isempty(tz.zone)) { free(tz.zone); @@ -199,19 +196,10 @@ static int write_data_timezone(void) { int r = 0; _cleanup_free_ char *p = NULL; -#ifdef TARGET_DEBIAN - struct stat st; -#endif - if (!tz.zone) { if (unlink("/etc/localtime") < 0 && errno != ENOENT) r = -errno; -#ifdef TARGET_DEBIAN - if (unlink("/etc/timezone") < 0 && errno != ENOENT) - r = -errno; -#endif - return r; } @@ -223,14 +211,6 @@ static int write_data_timezone(void) { if (r < 0) return r; -#ifdef TARGET_DEBIAN - if (stat("/etc/timezone", &st) == 0 && S_ISREG(st.st_mode)) { - r = write_one_line_file_atomic("/etc/timezone", tz.zone); - if (r < 0) - return r; - } -#endif - return 0; } @@ -294,8 +274,8 @@ static int write_data_local_rtc(void) { return 0; } } - - r = write_one_line_file_atomic("/etc/adjtime", w); + label_init("/etc"); + r = write_one_line_file_atomic_label("/etc/adjtime", w); free(w); return r; @@ -305,7 +285,7 @@ static char** get_ntp_services(void) { char **r = NULL, **files, **i; int k; - k = conf_files_list(&files, ".list", + k = conf_files_list(&files, ".list", NULL, "/etc/systemd/ntp-units.d", "/run/systemd/ntp-units.d", "/usr/local/lib/systemd/ntp-units.d", @@ -410,6 +390,7 @@ static int read_ntp(DBusConnection *bus) { goto finish; } + tz.can_ntp = 1; tz.use_ntp = streq(s, "enabled") || streq(s, "enabled-runtime"); @@ -418,6 +399,7 @@ static int read_ntp(DBusConnection *bus) { } /* NTP is not installed. */ + tz.can_ntp = 0; tz.use_ntp = 0; r = 0; @@ -611,6 +593,20 @@ finish: return r; } +static int property_append_can_ntp(DBusMessageIter *i, const char *property, void *data) { + dbus_bool_t db; + + assert(i); + assert(property); + + db = tz.can_ntp > 0; + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &db)) + return -ENOMEM; + + return 0; +} + static int property_append_ntp(DBusMessageIter *i, const char *property, void *data) { dbus_bool_t db; @@ -628,6 +624,7 @@ static int property_append_ntp(DBusMessageIter *i, const char *property, void *d static const BusProperty bus_timedate_properties[] = { { "Timezone", bus_property_append_string, "s", offsetof(TZ, zone), true }, { "LocalRTC", bus_property_append_bool, "b", offsetof(TZ, local_rtc) }, + { "CanNTP", property_append_can_ntp, "b", offsetof(TZ, can_ntp) }, { "NTP", property_append_ntp, "b", offsetof(TZ, use_ntp) }, { NULL, } }; @@ -936,7 +933,7 @@ static int connect_bus(DBusConnection **_bus) { if (!bus) { log_error("Failed to get system D-Bus connection: %s", bus_error_message(&error)); r = -ECONNREFUSED; - goto fail; + goto fail2; } dbus_connection_set_exit_on_disconnect(bus, FALSE); @@ -968,7 +965,7 @@ static int connect_bus(DBusConnection **_bus) { fail: dbus_connection_close(bus); dbus_connection_unref(bus); - +fail2: dbus_error_free(&error); return r;