X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedated.c;h=809c80bad11297acc1fdd6342f79d05f542fef97;hb=9bcbce4201afada1c0ad8ada0cbfbbf58a52a6a7;hp=7b22b2071919fbcab7122b93530236acdf26ad2d;hpb=40ca29a1370379d43e44c0ed425eecc7218dcbca;p=elogind.git diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index 7b22b2071..809c80bad 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -45,8 +45,8 @@ typedef struct Context { char *zone; bool local_rtc; - int can_ntp; - int use_ntp; + unsigned can_ntp; + unsigned use_ntp; Hashmap *polkit_registry; } Context; @@ -63,7 +63,7 @@ static void context_reset(Context *c) { static void context_free(Context *c, sd_bus *bus) { assert(c); - free(c->zone); + context_reset(c); bus_verify_polkit_async_registry_free(bus, c->polkit_registry); } @@ -452,14 +452,83 @@ static int context_enable_ntp(Context*c, sd_bus *bus, sd_bus_error *error) { return -ENOTSUP; } +static int property_get_rtc_time( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + sd_bus_error *error, + void *userdata) { + + struct tm tm; + usec_t t; + int r; + + zero(tm); + r = hwclock_get_time(&tm); + if (r < 0) { + sd_bus_error_set_errnof(error, -r, "Failed to read RTC: %s", strerror(-r)); + return r; + } + + t = (usec_t) mktime(&tm) * USEC_PER_SEC; + + r = sd_bus_message_append(reply, "t", t); + if (r < 0) + return r; + + return 1; +} + +static int property_get_time( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + sd_bus_error *error, + void *userdata) { + + int r; + + r = sd_bus_message_append(reply, "t", now(CLOCK_REALTIME)); + if (r < 0) + return r; + + return 1; +} + +static int property_get_ntp_sync( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + sd_bus_error *error, + void *userdata) { + + int r; + + r = sd_bus_message_append(reply, "b", ntp_synced()); + if (r < 0) + return r; + + return 1; +} + static int method_set_timezone(sd_bus *bus, sd_bus_message *m, void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; Context *c = userdata; const char *z; - bool interactive; + unsigned interactive; char *t; int r; + assert(bus); + assert(m); + assert(c); + r = sd_bus_message_read(m, "sb", &z, &interactive); if (r < 0) return sd_bus_reply_method_errno(bus, m, r, NULL); @@ -474,7 +543,7 @@ static int method_set_timezone(sd_bus *bus, sd_bus_message *m, void *userdata) { if (r < 0) return sd_bus_reply_method_errno(bus, m, r, &error); if (r == 0) - return 1; + return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */ t = strdup(z); if (!t) @@ -516,7 +585,7 @@ static int method_set_timezone(sd_bus *bus, sd_bus_message *m, void *userdata) { static int method_set_local_rtc(sd_bus *bus, sd_bus_message *m, void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - bool lrtc, fix_system, interactive; + unsigned lrtc, fix_system, interactive; Context *c = userdata; struct timespec ts; int r; @@ -600,7 +669,7 @@ static int method_set_local_rtc(sd_bus *bus, sd_bus_message *m, void *userdata) static int method_set_time(sd_bus *bus, sd_bus_message *m, void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - bool relative, interactive; + unsigned relative, interactive; Context *c = userdata; int64_t utc; struct timespec ts; @@ -666,7 +735,7 @@ static int method_set_time(sd_bus *bus, sd_bus_message *m, void *userdata) { static int method_set_ntp(sd_bus *bus, sd_bus_message *m, void *userdata) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - bool ntp, interactive; + unsigned ntp, interactive; Context *c = userdata; int r; @@ -706,6 +775,9 @@ static const sd_bus_vtable timedate_vtable[] = { 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("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), SD_BUS_METHOD("SetTime", "xbb", NULL, method_set_time, 0), SD_BUS_METHOD("SetTimezone", "sb", NULL, method_set_timezone, 0), SD_BUS_METHOD("SetLocalRTC", "bbb", NULL, method_set_local_rtc, 0), @@ -769,7 +841,6 @@ int main(int argc, char *argv[]) { int r; log_set_target(LOG_TARGET_AUTO); - log_set_max_level(LOG_DEBUG); log_parse_environment(); log_open(); @@ -809,7 +880,6 @@ int main(int argc, char *argv[]) { goto finish; } - sd_bus_flush(bus); r = 0; finish: