X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedatectl.c;h=2c24b78458b367da5c0318f88be2c04129d108e7;hb=dabeaa460d9fa01db645116775f53e3071977503;hp=777a3a32e320e9410289866f739172a01614470c;hpb=ffc06c3513d9a0693c7f810d03b20705127ba55a;p=elogind.git diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 777a3a32e..2c24b7845 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -58,6 +58,9 @@ static void polkit_agent_open_if_enabled(void) { if (!arg_ask_password) return; + if (arg_transport != BUS_TRANSPORT_LOCAL) + return; + polkit_agent_open(); } @@ -95,6 +98,7 @@ static void print_status_info(const StatusInfo *i) { char s[32]; struct tm tm; time_t sec; + bool have_time = false; char *zc, *zn; time_t t, tc, tn; int dn; @@ -109,17 +113,29 @@ static void print_status_info(const StatusInfo *i) { unsetenv("TZ"); } - sec = (time_t) (i->time / USEC_PER_SEC); + if (i->time != 0) { + sec = (time_t) (i->time / USEC_PER_SEC); + have_time = true; + } else if (arg_transport == BUS_TRANSPORT_LOCAL) { + sec = time(NULL); + have_time = true; + } else + fprintf(stderr, "Warning: could not get time from timedated and not operating locally.\n\n"); - zero(tm); - assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) > 0); - char_array_0(a); - printf(" Local time: %s\n", a); + if (have_time) { + zero(tm); + assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) > 0); + char_array_0(a); + printf(" Local time: %s\n", a); - zero(tm); - assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm)) > 0); - char_array_0(a); - printf(" Universal time: %s\n", a); + zero(tm); + assert_se(strftime(a, sizeof(a), "%a %Y-%m-%d %H:%M:%S UTC", gmtime_r(&sec, &tm)) > 0); + char_array_0(a); + printf(" Universal time: %s\n", a); + } else { + printf(" Local time: %s\n", "n/a"); + printf(" Universal time: %s\n", "n/a"); + } if (i->rtc_time > 0) { time_t rtc_sec; @@ -130,7 +146,7 @@ static void print_status_info(const StatusInfo *i) { char_array_0(a); printf(" RTC time: %s\n", a); } else - printf(" RTC time: n/a\n"); + printf(" RTC time: %s\n", "n/a"); zero(tm); assert_se(strftime(a, sizeof(a), "%Z, %z", localtime_r(&sec, &tm)) > 0); @@ -148,8 +164,8 @@ static void print_status_info(const StatusInfo *i) { &tc, &zc, &is_dstc, &tn, &dn, &zn, &is_dstn); if (r < 0) - printf(" DST active: n/a\n"); - else { + printf(" DST active: %s\n", "n/a"); + else if (have_time) { printf(" DST active: %s\n", yes_no(is_dstc)); t = tc - 1; @@ -180,7 +196,8 @@ static void print_status_info(const StatusInfo *i) { free(zc); free(zn); - } + } else + printf(" DST active: %s\n", yes_no(is_dstc)); if (i->rtc_local) fputs("\n" ANSI_HIGHLIGHT_ON @@ -191,16 +208,15 @@ static void print_status_info(const StatusInfo *i) { } static int show_status(sd_bus *bus, char **args, unsigned n) { - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; StatusInfo info = {}; - const struct bus_properties_map map[] = { - { "s", "Timezone", &info.timezone }, - { "b", "LocalRTC", &info.rtc_local }, - { "b", "NTP", &info.ntp_enabled }, - { "b", "CanNTP", &info.ntp_capable }, - { "b", "NTPSynchronized", &info.ntp_synced}, - { "t", "TimeUSec", &info.time }, - { "t", "RTCTimeUSec", &info.rtc_time }, + static const struct bus_properties_map map[] = { + { "Timezone", "s", NULL, offsetof(StatusInfo, timezone) }, + { "LocalRTC", "b", NULL, offsetof(StatusInfo, rtc_local) }, + { "NTP", "b", NULL, offsetof(StatusInfo, ntp_enabled) }, + { "CanNTP", "b", NULL, offsetof(StatusInfo, ntp_capable) }, + { "NTPSynchronized", "b", NULL, offsetof(StatusInfo, ntp_synced) }, + { "TimeUSec", "t", NULL, offsetof(StatusInfo, time) }, + { "RTCTimeUSec", "t", NULL, offsetof(StatusInfo, rtc_time) }, {} }; int r; @@ -210,9 +226,12 @@ static int show_status(sd_bus *bus, char **args, unsigned n) { r = bus_map_all_properties(bus, "org.freedesktop.timedate1", "/org/freedesktop/timedate1", - map); - if (r < 0) + map, + &info); + if (r < 0) { + log_error("Failed to query server: %s", strerror(-r)); goto fail; + } print_status_info(&info); @@ -407,21 +426,20 @@ static int help(void) { printf("%s [OPTIONS...] COMMAND ...\n\n" "Query or change system time and date settings.\n\n" - " -h --help Show this help\n" - " --version Show package version\n" - " --adjust-system-clock\n" - " Adjust system clock when changing local RTC mode\n" - " --no-pager Do not pipe output into a pager\n" - " --no-ask-password Do not prompt for password\n" - " -H --host=[USER@]HOST Operate on remote host\n" - " -M --machine=CONTAINER Operate on local container\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " --no-pager Do not pipe output into a pager\n" + " --no-ask-password Do not prompt for password\n" + " -H --host=[USER@]HOST Operate on remote host\n" + " -M --machine=CONTAINER Operate on local container\n" + " --adjust-system-clock Adjust system clock when changing local RTC mode\n\n" "Commands:\n" - " status Show current time settings\n" - " set-time TIME Set system time\n" - " set-timezone ZONE Set system timezone\n" - " list-timezones Show known timezones\n" - " set-local-rtc BOOL Control whether RTC is in local time\n" - " set-ntp BOOL Control whether NTP is enabled\n", + " status Show current time settings\n" + " set-time TIME Set system time\n" + " set-timezone ZONE Set system timezone\n" + " list-timezones Show known timezones\n" + " set-local-rtc BOOL Control whether RTC is in local time\n" + " set-ntp BOOL Control whether NTP is enabled\n", program_invocation_short_name); return 0; @@ -444,7 +462,7 @@ static int parse_argv(int argc, char *argv[]) { { "machine", required_argument, NULL, 'M' }, { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD }, { "adjust-system-clock", no_argument, NULL, ARG_ADJUST_SYSTEM_CLOCK }, - { NULL, 0, NULL, 0 } + {} }; int c; @@ -457,8 +475,7 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case 'h': - help(); - return 0; + return help(); case ARG_VERSION: puts(PACKAGE_STRING); @@ -491,8 +508,7 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } } @@ -580,33 +596,27 @@ static int timedatectl_main(sd_bus *bus, int argc, char *argv[]) { } int main(int argc, char *argv[]) { - int r, ret = EXIT_FAILURE; _cleanup_bus_unref_ sd_bus *bus = NULL; + int r; setlocale(LC_ALL, ""); log_parse_environment(); log_open(); r = parse_argv(argc, argv); - if (r < 0) - goto finish; - else if (r == 0) { - ret = EXIT_SUCCESS; + if (r <= 0) goto finish; - } r = bus_open_transport(arg_transport, arg_host, false, &bus); if (r < 0) { log_error("Failed to create bus connection: %s", strerror(-r)); - ret = EXIT_FAILURE; goto finish; } r = timedatectl_main(bus, argc, argv); - ret = r < 0 ? EXIT_FAILURE : r; finish: pager_close(); - return ret; + return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }