From 82d115d9abf5b2666e5561450fbb17c9044a0b33 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 24 May 2014 10:38:32 +0800 Subject: timedated: refuse manual system time updates when automatic timesync is enabled --- src/timedate/timedated.c | 46 +++++++++++++--------------------------------- 1 file changed, 13 insertions(+), 33 deletions(-) (limited to 'src/timedate/timedated.c') diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 0e74c25b05..204031fe77 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; -- cgit v1.2.3-54-g00ecf