X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedated.c;h=80c24eb62b029f67470ddd3f919f350711d15b44;hb=04045d8426fa03fc4414d71b0454c47e951840d8;hp=7eed31c477e73a0670477cd5c71f061e8b608914;hpb=e19a21a8796a098c8387600e9e57148b0a8ffd6c;p=elogind.git diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 7eed31c47..80c24eb62 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" @@ -176,23 +178,6 @@ static int read_data(void) { } } -#ifdef TARGET_FEDORA - r = parse_env_file("/etc/sysconfig/clock", NEWLINE, - "ZONE", &tz.zone, - NULL); - - if (r < 0 && r != -ENOENT) - log_warning("Failed to read /etc/sysconfig/clock: %s", strerror(-r)); -#endif - -#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); @@ -208,19 +193,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; } @@ -232,14 +208,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; } @@ -303,8 +271,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; @@ -314,7 +282,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", @@ -696,13 +664,13 @@ static DBusHandlerResult timedate_message_handler( return bus_send_error_reply(connection, message, NULL, r); } + /* 2. Tell the kernel our time zone */ + hwclock_set_timezone(NULL); + if (tz.local_rtc) { struct timespec ts; struct tm *tm; - /* 2. Teach kernel new timezone */ - hwclock_apply_localtime_delta(NULL); - /* 3. Sync RTC from system clock, with the new delta */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); assert_se(tm = localtime(&ts.tv_sec)); @@ -710,7 +678,7 @@ static DBusHandlerResult timedate_message_handler( } log_struct(LOG_INFO, - "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_TIMEZONE_CHANGE), + MESSAGE_ID(SD_MESSAGE_TIMEZONE_CHANGE), "TIMEZONE=%s", tz.zone, "MESSAGE=Changed timezone to '%s'.", tz.zone, NULL); @@ -753,11 +721,8 @@ static DBusHandlerResult timedate_message_handler( return bus_send_error_reply(connection, message, NULL, r); } - /* 2. Teach kernel new timezone */ - if (tz.local_rtc) - hwclock_apply_localtime_delta(NULL); - else - hwclock_reset_localtime_delta(); + /* 2. Tell the kernel our time zone */ + hwclock_set_timezone(NULL); /* 3. Synchronize clocks */ assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); @@ -855,7 +820,7 @@ static DBusHandlerResult timedate_message_handler( hwclock_set_time(tm); log_struct(LOG_INFO, - "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(SD_MESSAGE_TIME_CHANGE), + MESSAGE_ID(SD_MESSAGE_TIME_CHANGE), "REALTIME=%llu", (unsigned long long) timespec_load(&ts), "MESSAGE=Changed local time to %s", ctime(&ts.tv_sec), NULL); @@ -948,7 +913,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); @@ -980,7 +945,7 @@ static int connect_bus(DBusConnection **_bus) { fail: dbus_connection_close(bus); dbus_connection_unref(bus); - +fail2: dbus_error_free(&error); return r; @@ -1035,7 +1000,7 @@ int main(int argc, char *argv[]) { if (!exiting && remain_until < now(CLOCK_MONOTONIC)) { exiting = true; - bus_async_unregister_and_exit(bus, "org.freedesktop.hostname1"); + bus_async_unregister_and_exit(bus, "org.freedesktop.timedated1"); } }