From 82d115d9abf5b2666e5561450fbb17c9044a0b33 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 24 May 2014 10:38:32 +0800 Subject: [PATCH 1/1] timedated: refuse manual system time updates when automatic timesync is enabled --- src/libsystemd/sd-bus/bus-util.c | 14 ---------- src/libsystemd/sd-bus/bus-util.h | 1 - src/shared/bus-errors.h | 2 ++ src/timedate/timedated.c | 46 +++++++++----------------------- 4 files changed, 15 insertions(+), 48 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c index 6c9548f9a..6bd21ccb3 100644 --- a/src/libsystemd/sd-bus/bus-util.c +++ b/src/libsystemd/sd-bus/bus-util.c @@ -1104,20 +1104,6 @@ int bus_open_transport_systemd(BusTransport transport, const char *host, bool us return r; } -int bus_property_get_tristate( - sd_bus *bus, - const char *path, - const char *interface, - const char *property, - sd_bus_message *reply, - void *userdata, - sd_bus_error *error) { - - int *tristate = userdata; - - return sd_bus_message_append(reply, "b", *tristate > 0); -} - int bus_property_get_bool( sd_bus *bus, const char *path, diff --git a/src/libsystemd/sd-bus/bus-util.h b/src/libsystemd/sd-bus/bus-util.h index 1514fad81..0a3d5dd56 100644 --- a/src/libsystemd/sd-bus/bus-util.h +++ b/src/libsystemd/sd-bus/bus-util.h @@ -76,7 +76,6 @@ int bus_open_transport_systemd(BusTransport transport, const char *host, bool us int bus_print_property(const char *name, sd_bus_message *property, bool all); int bus_print_all_properties(sd_bus *bus, const char *dest, const char *path, char **filter, bool all); -int bus_property_get_tristate(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); int bus_property_get_bool(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *error); #define bus_property_get_usec ((sd_bus_property_get_t) NULL) diff --git a/src/shared/bus-errors.h b/src/shared/bus-errors.h index 45e129387..48a2b4ef1 100644 --- a/src/shared/bus-errors.h +++ b/src/shared/bus-errors.h @@ -56,4 +56,6 @@ #define BUS_ERROR_OPERATION_IN_PROGRESS "org.freedesktop.login1.OperationInProgress" #define BUS_ERROR_SLEEP_VERB_NOT_SUPPORTED "org.freedesktop.login1.SleepVerbNotSupported" +#define BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED "org.freedesktop.timedate1.AutomaticTimeSyncEnabled" + #define BUS_ERROR_NO_SUCH_PROCESS "org.freedesktop.systemd1.NoSuchProcess" diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 0e74c25b0..204031fe7 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -37,6 +37,7 @@ #include "fileio-label.h" #include "label.h" #include "bus-util.h" +#include "bus-errors.h" #include "event-util.h" #define NULL_ADJTIME_UTC "0.0 0 0\n0\nUTC\n" @@ -45,25 +46,15 @@ typedef struct Context { char *zone; bool local_rtc; - unsigned can_ntp; - unsigned use_ntp; + bool can_ntp; + bool use_ntp; Hashmap *polkit_registry; } Context; -static void context_reset(Context *c) { - assert(c); - - free(c->zone); - c->zone = NULL; - - c->local_rtc = false; - c->can_ntp = c->use_ntp = -1; -} - static void context_free(Context *c, sd_bus *bus) { assert(c); - context_reset(c); + free(c->zone); bus_verify_polkit_async_registry_free(bus, c->polkit_registry); } @@ -121,8 +112,6 @@ static int context_read_data(Context *c) { assert(c); - context_reset(c); - r = readlink_malloc("/etc/localtime", &t); if (r < 0) { if (r == -EINVAL) @@ -323,18 +312,12 @@ static int context_read_ntp(Context *c, sd_bus *bus) { if (r < 0) return r; - c->can_ntp = 1; - c->use_ntp = - streq(s, "enabled") || - streq(s, "enabled-runtime"); + c->can_ntp = true; + c->use_ntp = STR_IN_SET(s, "enabled", "enabled-runtime"); return 0; } - /* NTP is not installed. */ - c->can_ntp = 0; - c->use_ntp = 0; - return 0; } @@ -664,6 +647,9 @@ static int method_set_time(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu assert(m); assert(c); + if (c->use_ntp) + return sd_bus_error_setf(error, BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED, "Automatic time synchronization is enabled"); + r = sd_bus_message_read(m, "xbb", &utc, &relative, &interactive); if (r < 0) return r; @@ -756,9 +742,9 @@ static int method_set_ntp(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus static const sd_bus_vtable timedate_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Timezone", "s", NULL, offsetof(Context, zone), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), - SD_BUS_PROPERTY("LocalRTC", "b", NULL, offsetof(Context, local_rtc), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), - SD_BUS_PROPERTY("CanNTP", "b", bus_property_get_tristate, offsetof(Context, can_ntp), 0), - SD_BUS_PROPERTY("NTP", "b", bus_property_get_tristate, offsetof(Context, use_ntp), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), + SD_BUS_PROPERTY("LocalRTC", "b", bus_property_get_bool, offsetof(Context, local_rtc), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), + SD_BUS_PROPERTY("CanNTP", "b", bus_property_get_bool, offsetof(Context, can_ntp), 0), + SD_BUS_PROPERTY("NTP", "b", bus_property_get_bool, offsetof(Context, use_ntp), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("NTPSynchronized", "b", property_get_ntp_sync, 0, 0), SD_BUS_PROPERTY("TimeUSec", "t", property_get_time, 0, 0), SD_BUS_PROPERTY("RTCTimeUSec", "t", property_get_rtc_time, 0, 0), @@ -808,13 +794,7 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { } int main(int argc, char *argv[]) { - Context context = { - .zone = NULL, - .local_rtc = false, - .can_ntp = -1, - .use_ntp = -1, - }; - + Context context = {}; _cleanup_event_unref_ sd_event *event = NULL; _cleanup_bus_unref_ sd_bus *bus = NULL; int r; -- 2.30.2