timedated: expose time and NTP sync flag via the bus

This way, timedatectl can be run over the network and determine all
properties correctly from the server rather than the client.
This commit is contained in:
Lennart Poettering 2013-10-17 01:03:39 +02:00
parent aacf3b483b
commit 03cc26dda4
4 changed files with 53 additions and 12 deletions

View file

@ -21,6 +21,7 @@
#include <time.h>
#include <string.h>
#include <sys/timex.h>
#include "util.h"
#include "time-util.h"
@ -792,3 +793,15 @@ int parse_nsec(const char *t, nsec_t *nsec) {
return 0;
}
bool ntp_synced(void) {
struct timex txc = {};
if (adjtimex(&txc) < 0)
return false;
if (txc.status & STA_UNSYNC)
return false;
return true;
}

View file

@ -84,3 +84,5 @@ int parse_timestamp(const char *t, usec_t *usec);
int parse_sec(const char *t, usec_t *usec);
int parse_nsec(const char *t, nsec_t *nsec);
bool ntp_synced(void);

View file

@ -72,18 +72,6 @@ typedef struct StatusInfo {
bool can_ntp;
} StatusInfo;
static bool ntp_synced(void) {
struct timex txc = {};
if (adjtimex(&txc) < 0)
return false;
if (txc.status & STA_UNSYNC)
return false;
return true;
}
static const char *jump_str(int delta_minutes, char *s, size_t size) {
if (delta_minutes == 60)
return "one hour forward";

View file

@ -481,6 +481,42 @@ static int property_get_rtc_time(
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;
@ -735,6 +771,8 @@ 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),