chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
timedatectl,hostnamectl: rework --help text
[elogind.git]
/
src
/
timedate
/
timedated.c
diff --git
a/src/timedate/timedated.c
b/src/timedate/timedated.c
index 5387699bf316b1d1830fe1f7989b281f40cb6df1..40ba25509059036ee359839da07a4da36f8ecd70 100644
(file)
--- a/
src/timedate/timedated.c
+++ b/
src/timedate/timedated.c
@@
-25,6
+25,8
@@
#include <string.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>
+#include "systemd/sd-id128.h"
+#include "systemd/sd-messages.h"
#include "util.h"
#include "strv.h"
#include "dbus-common.h"
#include "util.h"
#include "strv.h"
#include "dbus-common.h"
@@
-32,6
+34,7
@@
#include "def.h"
#include "hwclock.h"
#include "conf-files.h"
#include "def.h"
#include "hwclock.h"
#include "conf-files.h"
+#include "path-util.h"
#define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
#define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
#define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n"
#define NULL_ADJTIME_LOCAL "0.0 0 0\n0\nLOCAL\n"
@@
-143,62
+146,50
@@
static bool valid_timezone(const char *name) {
return true;
}
return true;
}
-static void verify_timezone(void) {
- char *p, *a = NULL, *b = NULL;
- size_t l, q;
- int j, k;
+static int read_data(void) {
+ int r;
+ _cleanup_free_ char *t = NULL;
- if (!tz.zone)
- return;
+ free_data();
- p = strappend("/usr/share/zoneinfo/", tz.zone);
- if (!p) {
- log_error("Out of memory");
- return;
- }
+ r = readlink_malloc("/etc/localtime", &t);
+ if (r < 0) {
+ if (r == -EINVAL)
+ log_warning("/etc/localtime should be a symbolic link to a timezone data file in /usr/share/zoneinfo/.");
+ else
+ log_warning("Failed to get target of /etc/localtime: %s", strerror(-r));
+ } else {
+ const char *e;
- j = read_full_file("/etc/localtime", &a, &l);
- k = read_full_file(p, &b, &q);
+ e = path_startswith(t, "/usr/share/zoneinfo/");
+ if (!e)
+ e = path_startswith(t, "../usr/share/zoneinfo/");
- free(p);
+ if (!e)
+ log_warning("/etc/localtime should be a symbolic link to a timezone data file in /usr/share/zoneinfo/.");
+ else {
+ tz.zone = strdup(e);
+ if (!tz.zone)
+ return log_oom();
- if (j < 0 || k < 0 || l != q || memcmp(a, b, l)) {
- log_warning("/etc/localtime and /etc/timezone out of sync.");
- free(tz.zone);
- tz.zone = NULL;
+ goto have_timezone;
+ }
}
}
- free(a);
- free(b);
-}
-
-static int read_data(void) {
- int r;
-
- free_data();
-
+#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));
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));
-
-#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
}
}
+#endif
+have_timezone:
if (isempty(tz.zone)) {
free(tz.zone);
tz.zone = NULL;
}
if (isempty(tz.zone)) {
free(tz.zone);
tz.zone = NULL;
}
- verify_timezone();
-
tz.local_rtc = hwclock_is_localtime() > 0;
return 0;
tz.local_rtc = hwclock_is_localtime() > 0;
return 0;
@@
-206,33
+197,39
@@
static int read_data(void) {
static int write_data_timezone(void) {
int r = 0;
static int write_data_timezone(void) {
int r = 0;
- char *p;
+ _cleanup_free_ char *p = NULL;
+
+#ifdef TARGET_DEBIAN
+ struct stat st;
+#endif
if (!tz.zone) {
if (!tz.zone) {
- if (unlink("/etc/
timezon
e") < 0 && errno != ENOENT)
+ if (unlink("/etc/
localtim
e") < 0 && errno != ENOENT)
r = -errno;
r = -errno;
- if (unlink("/etc/localtime") < 0 && errno != ENOENT)
+#ifdef TARGET_DEBIAN
+ if (unlink("/etc/timezone") < 0 && errno != ENOENT)
r = -errno;
r = -errno;
+#endif
return r;
}
return r;
}
- p = strappend("/usr/share/zoneinfo/", tz.zone);
- if (!p) {
- log_error("Out of memory");
- return -ENOMEM;
- }
-
- r = symlink_or_copy_atomic(p, "/etc/localtime");
- free(p);
+ p = strappend("../usr/share/zoneinfo/", tz.zone);
+ if (!p)
+ return log_oom();
+ r = symlink_atomic(p, "/etc/localtime");
if (r < 0)
return r;
if (r < 0)
return r;
- r = write_one_line_file_atomic("/etc/timezone", tz.zone);
- 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;
}
return 0;
}
@@
-341,7
+338,7
@@
static char** get_ntp_services(void) {
q = strv_append(r, l);
if (!q) {
q = strv_append(r, l);
if (!q) {
- log_
error("Out of memory"
);
+ log_
oom(
);
break;
}
break;
}
@@
-354,7
+351,7
@@
static char** get_ntp_services(void) {
strv_free(files);
strv_free(files);
- return
r
;
+ return
strv_uniq(r)
;
}
static int read_ntp(DBusConnection *bus) {
}
static int read_ntp(DBusConnection *bus) {
@@
-379,16
+376,14
@@
static int read_ntp(DBusConnection *bus) {
"org.freedesktop.systemd1.Manager",
"GetUnitFileState");
if (!m) {
"org.freedesktop.systemd1.Manager",
"GetUnitFileState");
if (!m) {
- log_error("Out of memory");
- r = -ENOMEM;
+ r = log_oom();
goto finish;
}
if (!dbus_message_append_args(m,
DBUS_TYPE_STRING, i,
DBUS_TYPE_INVALID)) {
goto finish;
}
if (!dbus_message_append_args(m,
DBUS_TYPE_STRING, i,
DBUS_TYPE_INVALID)) {
- log_error("Could not append arguments to message.");
- r = -ENOMEM;
+ r = log_oom();
goto finish;
}
goto finish;
}
@@
-692,20
+687,24
@@
static DBusHandlerResult timedate_message_handler(
return bus_send_error_reply(connection, message, NULL, r);
}
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;
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));
hwclock_set_time(tm);
}
/* 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));
hwclock_set_time(tm);
}
- log_info("Changed timezone to '%s'.", tz.zone);
+ log_struct(LOG_INFO,
+ MESSAGE_ID(SD_MESSAGE_TIMEZONE_CHANGE),
+ "TIMEZONE=%s", tz.zone,
+ "MESSAGE=Changed timezone to '%s'.", tz.zone,
+ NULL);
changed = bus_properties_changed_new(
"/org/freedesktop/timedate1",
changed = bus_properties_changed_new(
"/org/freedesktop/timedate1",
@@
-745,11
+744,8
@@
static DBusHandlerResult timedate_message_handler(
return bus_send_error_reply(connection, message, NULL, r);
}
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);
/* 3. Synchronize clocks */
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
@@
-846,7
+842,11
@@
static DBusHandlerResult timedate_message_handler(
hwclock_set_time(tm);
hwclock_set_time(tm);
- log_info("Changed local time to %s", ctime(&ts.tv_sec));
+ log_struct(LOG_INFO,
+ 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);
}
} else if (dbus_message_is_method_call(message, "org.freedesktop.timedate1", "SetNTP")) {
dbus_bool_t ntp;
}
} else if (dbus_message_is_method_call(message, "org.freedesktop.timedate1", "SetNTP")) {
dbus_bool_t ntp;
@@
-943,8
+943,7
@@
static int connect_bus(DBusConnection **_bus) {
if (!dbus_connection_register_object_path(bus, "/org/freedesktop/timedate1", &timedate_vtable, NULL) ||
!dbus_connection_add_filter(bus, bus_exit_idle_filter, &remain_until, NULL)) {
if (!dbus_connection_register_object_path(bus, "/org/freedesktop/timedate1", &timedate_vtable, NULL) ||
!dbus_connection_add_filter(bus, bus_exit_idle_filter, &remain_until, NULL)) {
- log_error("Not enough memory");
- r = -ENOMEM;
+ r = log_oom();
goto fail;
}
goto fail;
}
@@
-1024,7
+1023,7
@@
int main(int argc, char *argv[]) {
if (!exiting && remain_until < now(CLOCK_MONOTONIC)) {
exiting = true;
if (!exiting && remain_until < now(CLOCK_MONOTONIC)) {
exiting = true;
- bus_async_unregister_and_exit(bus, "org.freedesktop.
hostname
1");
+ bus_async_unregister_and_exit(bus, "org.freedesktop.
timedated
1");
}
}
}
}