From: Zbigniew Jędrzejewski-Szmek Date: Mon, 5 Jul 2021 19:41:59 +0000 (+0200) Subject: tree-wide: add FORMAT_TIMESTAMP_STYLE() X-Git-Tag: v250-rc1~952^2~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0086ef19cb9fb2ad3698c2ef51681e6c77eff957;p=thirdparty%2Fsystemd.git tree-wide: add FORMAT_TIMESTAMP_STYLE() --- diff --git a/src/basic/time-util.h b/src/basic/time-util.h index acca1d1a2f2..a3f9f44797f 100644 --- a/src/basic/time-util.h +++ b/src/basic/time-util.h @@ -132,7 +132,8 @@ static inline char* format_timestamp(char *buf, size_t l, usec_t t) { #define FORMAT_TIMESTAMP_RELATIVE(t) \ format_timestamp_relative((char[FORMAT_TIMESTAMP_RELATIVE_MAX]){}, FORMAT_TIMESTAMP_RELATIVE_MAX, t) #define FORMAT_TIMESPAN(t, accuracy) format_timespan((char[FORMAT_TIMESPAN_MAX]){}, FORMAT_TIMESPAN_MAX, t, accuracy) - +#define FORMAT_TIMESTAMP_STYLE(t, style) \ + format_timestamp_style((char[FORMAT_TIMESTAMP_MAX]){}, FORMAT_TIMESTAMP_MAX, t, style) int parse_timestamp(const char *t, usec_t *usec); diff --git a/src/libsystemd/sd-bus/bus-dump.c b/src/libsystemd/sd-bus/bus-dump.c index d5d22b0d8c6..11149d8e5bf 100644 --- a/src/libsystemd/sd-bus/bus-dump.c +++ b/src/libsystemd/sd-bus/bus-dump.c @@ -55,15 +55,11 @@ _public_ int sd_bus_message_dump(sd_bus_message *m, FILE *f, uint64_t flags) { f = stdout; if (flags & SD_BUS_MESSAGE_DUMP_WITH_HEADER) { - char buf[FORMAT_TIMESTAMP_MAX]; - const char *p; usec_t ts = m->realtime; if (ts == 0) ts = now(CLOCK_REALTIME); - p = format_timestamp_style(buf, sizeof(buf), ts, TIMESTAMP_US_UTC); - fprintf(f, "%s%s%s Type=%s%s%s Endian=%c Flags=%u Version=%u", m->header->type == SD_BUS_MESSAGE_METHOD_ERROR ? ansi_highlight_red() : @@ -90,9 +86,7 @@ _public_ int sd_bus_message_dump(sd_bus_message *m, FILE *f, uint64_t flags) { if (m->reply_cookie != 0) fprintf(f, " ReplyCookie=%" PRIu64, m->reply_cookie); - fprintf(f, " Timestamp=\"%s\"", strna(p)); - - fputs("\n", f); + fprintf(f, " Timestamp=\"%s\"\n", strna(FORMAT_TIMESTAMP_STYLE(ts, TIMESTAMP_US_UTC))); if (m->sender) fprintf(f, " Sender=%s%s%s", ansi_highlight(), m->sender, ansi_normal()); diff --git a/src/systemctl/systemctl-logind.c b/src/systemctl/systemctl-logind.c index 28dd25b523d..b1c0e13f2cd 100644 --- a/src/systemctl/systemctl-logind.c +++ b/src/systemctl/systemctl-logind.c @@ -296,7 +296,6 @@ int logind_schedule_shutdown(void) { #if ENABLE_LOGIND _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; - char date[FORMAT_TIMESTAMP_MAX]; const char *action; const char *log_action; sd_bus *bus; @@ -340,7 +339,9 @@ int logind_schedule_shutdown(void) { return log_warning_errno(r, "Failed to call ScheduleShutdown in logind, proceeding with immediate shutdown: %s", bus_error_message(&error, r)); if (!arg_quiet) - log_info("%s scheduled for %s, use 'shutdown -c' to cancel.", log_action, format_timestamp_style(date, sizeof(date), arg_when, arg_timestamp_style)); + log_info("%s scheduled for %s, use 'shutdown -c' to cancel.", + log_action, + FORMAT_TIMESTAMP_STYLE(arg_when, arg_timestamp_style)); return 0; #else return log_error_errno(SYNTHETIC_ERRNO(ENOSYS), diff --git a/src/systemctl/systemctl-show.c b/src/systemctl/systemctl-show.c index 3b5f2a43209..621631c6010 100644 --- a/src/systemctl/systemctl-show.c +++ b/src/systemctl/systemctl-show.c @@ -300,7 +300,6 @@ static void print_status_info( UnitStatusInfo *i, bool *ellipsized) { - char since2[FORMAT_TIMESTAMP_MAX]; const char *s1, *s2, *active_on, *active_off, *on, *off, *ss, *fs; _cleanup_free_ char *formatted_path = NULL; ExecStatusInfo *p; @@ -420,8 +419,7 @@ static void print_status_info( i->active_exit_timestamp; s1 = FORMAT_TIMESTAMP_RELATIVE(timestamp); - s2 = format_timestamp_style(since2, sizeof(since2), timestamp, arg_timestamp_style); - + s2 = FORMAT_TIMESTAMP_STYLE(timestamp, arg_timestamp_style); if (s1) printf(" since %s; %s\n", s2, s1); else if (s2) @@ -442,23 +440,18 @@ static void print_status_info( } if (endswith(i->id, ".timer")) { - char tstamp2[FORMAT_TIMESTAMP_MAX]; - const char *next_rel_time, *next_time; - dual_timestamp nw, next = {i->next_elapse_real, - i->next_elapse_monotonic}; + const char *next_time; + dual_timestamp nw, next = {i->next_elapse_real, i->next_elapse_monotonic}; usec_t next_elapse; - printf(" Trigger: "); - dual_timestamp_get(&nw); next_elapse = calc_next_elapse(&nw, &next); - next_rel_time = FORMAT_TIMESTAMP_RELATIVE(next_elapse); - next_time = format_timestamp_style(tstamp2, sizeof tstamp2, next_elapse, arg_timestamp_style); + next_time = FORMAT_TIMESTAMP_STYLE(next_elapse, arg_timestamp_style); - if (next_time && next_rel_time) - printf("%s; %s\n", next_time, next_rel_time); - else - printf("n/a\n"); + printf(" Trigger: %s%s%s\n", + strna(next_time), + next_time ? "; " : "", + next_time ? strna(FORMAT_TIMESTAMP_RELATIVE(next_elapse)) : ""); } STRV_FOREACH(t, i->triggers) { @@ -476,13 +469,13 @@ static void print_status_info( if (!i->condition_result && i->condition_timestamp > 0) { UnitCondition *c; int n = 0; + const char *rel; - s1 = FORMAT_TIMESTAMP_RELATIVE(i->condition_timestamp); - s2 = format_timestamp_style(since2, sizeof(since2), i->condition_timestamp, arg_timestamp_style); - + rel = FORMAT_TIMESTAMP_RELATIVE(i->condition_timestamp); printf(" Condition: start %scondition failed%s at %s%s%s\n", ansi_highlight_yellow(), ansi_normal(), - s2, s1 ? "; " : "", strempty(s1)); + FORMAT_TIMESTAMP_STYLE(i->condition_timestamp, arg_timestamp_style), + rel ? "; " : "", strempty(rel)); LIST_FOREACH(conditions, c, i->conditions) if (c->tristate < 0) @@ -499,12 +492,13 @@ static void print_status_info( } if (!i->assert_result && i->assert_timestamp > 0) { - s1 = FORMAT_TIMESTAMP_RELATIVE(i->assert_timestamp); - s2 = format_timestamp_style(since2, sizeof(since2), i->assert_timestamp, arg_timestamp_style); + const char *rel; + rel = FORMAT_TIMESTAMP_RELATIVE(i->assert_timestamp); printf(" Assert: start %sassertion failed%s at %s%s%s\n", ansi_highlight_red(), ansi_normal(), - s2, s1 ? "; " : "", strempty(s1)); + FORMAT_TIMESTAMP_STYLE(i->assert_timestamp, arg_timestamp_style), + rel ? "; " : "", strempty(rel)); if (i->failed_assert_trigger) printf(" none of the trigger assertions were met\n"); else if (i->failed_assert) @@ -1255,13 +1249,10 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m if (r < 0) return bus_log_parse_error(r); - while ((r = sd_bus_message_read(m, "(sst)", &base, &spec, &next_elapse)) > 0) { - char timestamp[FORMAT_TIMESTAMP_MAX] = "n/a"; - - (void) format_timestamp_style(timestamp, sizeof(timestamp), next_elapse, arg_timestamp_style); + while ((r = sd_bus_message_read(m, "(sst)", &base, &spec, &next_elapse)) > 0) bus_print_property_valuef(name, expected_value, flags, - "{ %s=%s ; next_elapse=%s }", base, spec, timestamp); - } + "{ %s=%s ; next_elapse=%s }", base, spec, + FORMAT_TIMESTAMP_STYLE(next_elapse, arg_timestamp_style)); if (r < 0) return bus_log_parse_error(r); @@ -1280,7 +1271,6 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m return bus_log_parse_error(r); while ((r = exec_status_info_deserialize(m, &info, is_ex_prop)) > 0) { - char timestamp1[FORMAT_TIMESTAMP_MAX], timestamp2[FORMAT_TIMESTAMP_MAX]; _cleanup_strv_free_ char **optv = NULL; _cleanup_free_ char *tt = NULL, *o = NULL; @@ -1298,8 +1288,8 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m strna(info.path), strna(tt), strna(o), - strna(format_timestamp_style(timestamp1, sizeof(timestamp1), info.start_timestamp, arg_timestamp_style)), - strna(format_timestamp_style(timestamp2, sizeof(timestamp2), info.exit_timestamp, arg_timestamp_style)), + strna(FORMAT_TIMESTAMP_STYLE(info.start_timestamp, arg_timestamp_style)), + strna(FORMAT_TIMESTAMP_STYLE(info.exit_timestamp, arg_timestamp_style)), info.pid, sigchld_code_to_string(info.code), info.status, @@ -1311,8 +1301,8 @@ static int print_property(const char *name, const char *expected_value, sd_bus_m strna(info.path), strna(tt), yes_no(info.ignore), - strna(format_timestamp_style(timestamp1, sizeof(timestamp1), info.start_timestamp, arg_timestamp_style)), - strna(format_timestamp_style(timestamp2, sizeof(timestamp2), info.exit_timestamp, arg_timestamp_style)), + strna(FORMAT_TIMESTAMP_STYLE(info.start_timestamp, arg_timestamp_style)), + strna(FORMAT_TIMESTAMP_STYLE(info.exit_timestamp, arg_timestamp_style)), info.pid, sigchld_code_to_string(info.code), info.status, @@ -2014,7 +2004,6 @@ static int show_all( } static int show_system_status(sd_bus *bus) { - char since2[FORMAT_TIMESTAMP_MAX]; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(machine_info_clear) struct machine_info mi = {}; _cleanup_free_ char *hn = NULL; @@ -2057,7 +2046,7 @@ static int show_system_status(sd_bus *bus) { printf(" Failed: %" PRIu32 " units\n", mi.n_failed_units); printf(" Since: %s; %s\n", - format_timestamp_style(since2, sizeof(since2), mi.timestamp, arg_timestamp_style), + FORMAT_TIMESTAMP_STYLE(mi.timestamp, arg_timestamp_style), FORMAT_TIMESTAMP_RELATIVE(mi.timestamp)); printf(" CGroup: %s\n", mi.control_group ?: "/"); diff --git a/src/test/test-calendarspec.c b/src/test/test-calendarspec.c index d6ff7b7b218..5d680f9b9a4 100644 --- a/src/test/test-calendarspec.c +++ b/src/test/test-calendarspec.c @@ -36,7 +36,6 @@ static void _test_next(int line, const char *input, const char *new_tz, usec_t a CalendarSpec *c; usec_t u; char *old_tz; - char buf[FORMAT_TIMESTAMP_MAX]; int r; old_tz = getenv("TZ"); @@ -55,7 +54,7 @@ static void _test_next(int line, const char *input, const char *new_tz, usec_t a u = after; r = calendar_spec_next_usec(c, after, &u); - log_info("At: %s", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US)); + log_info("At: %s", r < 0 ? strerror_safe(r) : FORMAT_TIMESTAMP_STYLE(u, TIMESTAMP_US)); if (expect != USEC_INFINITY) assert_se(r >= 0 && u == expect); else @@ -92,18 +91,17 @@ static void test_timestamp(void) { static void test_hourly_bug_4031(void) { CalendarSpec *c; usec_t n, u, w; - char buf[FORMAT_TIMESTAMP_MAX], zaf[FORMAT_TIMESTAMP_MAX]; int r; assert_se(calendar_spec_from_string("hourly", &c) >= 0); n = now(CLOCK_REALTIME); assert_se((r = calendar_spec_next_usec(c, n, &u)) >= 0); - log_info("Now: %s (%"PRIu64")", format_timestamp_style(buf, sizeof buf, n, TIMESTAMP_US), n); - log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US), u); + log_info("Now: %s (%"PRIu64")", FORMAT_TIMESTAMP_STYLE(n, TIMESTAMP_US), n); + log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : FORMAT_TIMESTAMP_STYLE(u, TIMESTAMP_US), u); assert_se((r = calendar_spec_next_usec(c, u, &w)) >= 0); - log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(zaf, sizeof zaf, w, TIMESTAMP_US), w); + log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : FORMAT_TIMESTAMP_STYLE(w, TIMESTAMP_US), w); assert_se(n < u); assert_se(u <= n + USEC_PER_HOUR); diff --git a/src/test/test-date.c b/src/test/test-date.c index 47b70967385..355f4e17de5 100644 --- a/src/test/test-date.c +++ b/src/test/test-date.c @@ -15,12 +15,9 @@ static void test_should_pass(const char *p) { log_info("\"%s\" → \"%s\"", p, buf); assert_se(parse_timestamp(buf, &q) >= 0); - if (q != t) { - char tmp[FORMAT_TIMESTAMP_MAX]; - + if (q != t) log_error("round-trip failed: \"%s\" → \"%s\"", - buf, format_timestamp_style(tmp, sizeof(tmp), q, TIMESTAMP_US)); - } + buf, FORMAT_TIMESTAMP_STYLE(q, TIMESTAMP_US)); assert_se(q == t); assert_se(format_timestamp_relative(buf_relative, sizeof(buf_relative), t)); diff --git a/src/timesync/wait-sync.c b/src/timesync/wait-sync.c index 2a9b113ff48..892746d5ee6 100644 --- a/src/timesync/wait-sync.c +++ b/src/timesync/wait-sync.c @@ -100,9 +100,7 @@ static int clock_state_update( ClockState *sp, sd_event *event) { - char buf[MAX((size_t)FORMAT_TIMESTAMP_MAX, STRLEN("unrepresentable"))]; struct timex tx = {}; - const char * ts; usec_t t; int r; @@ -149,10 +147,9 @@ static int clock_state_update( if (tx.status & STA_NANO) tx.time.tv_usec /= 1000; t = timeval_load(&tx.time); - ts = format_timestamp_style(buf, sizeof(buf), t, TIMESTAMP_US_UTC); - if (!ts) - strcpy(buf, "unrepresentable"); - log_info("adjtime state %d status %x time %s", sp->adjtime_state, tx.status, ts); + + log_info("adjtime state %d status %x time %s", sp->adjtime_state, tx.status, + FORMAT_TIMESTAMP_STYLE(t, TIMESTAMP_US_UTC) ?: "unrepresentable"); sp->has_watchfile = access("/run/systemd/timesync/synchronized", F_OK) >= 0; if (sp->has_watchfile) diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index b32b709ef5b..41e3c934bee 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -544,22 +544,20 @@ static bool needs_cleanup( bool is_dir) { if (FLAGS_SET(age_by, AGE_BY_MTIME) && mtime != NSEC_INFINITY && mtime >= cutoff) { - char a[FORMAT_TIMESTAMP_MAX]; /* Follows spelling in stat(1). */ log_debug("%s \"%s\": modify time %s is too new.", is_dir ? "Directory" : "File", sub_path, - format_timestamp_style(a, sizeof(a), mtime / NSEC_PER_USEC, TIMESTAMP_US)); + FORMAT_TIMESTAMP_STYLE(mtime / NSEC_PER_USEC, TIMESTAMP_US)); return false; } if (FLAGS_SET(age_by, AGE_BY_ATIME) && atime != NSEC_INFINITY && atime >= cutoff) { - char a[FORMAT_TIMESTAMP_MAX]; log_debug("%s \"%s\": access time %s is too new.", is_dir ? "Directory" : "File", sub_path, - format_timestamp_style(a, sizeof(a), atime / NSEC_PER_USEC, TIMESTAMP_US)); + FORMAT_TIMESTAMP_STYLE(atime / NSEC_PER_USEC, TIMESTAMP_US)); return false; } @@ -569,21 +567,19 @@ static bool needs_cleanup( * by default for directories, because we change it when deleting. */ if (FLAGS_SET(age_by, AGE_BY_CTIME) && ctime != NSEC_INFINITY && ctime >= cutoff) { - char a[FORMAT_TIMESTAMP_MAX]; log_debug("%s \"%s\": change time %s is too new.", is_dir ? "Directory" : "File", sub_path, - format_timestamp_style(a, sizeof(a), ctime / NSEC_PER_USEC, TIMESTAMP_US)); + FORMAT_TIMESTAMP_STYLE(ctime / NSEC_PER_USEC, TIMESTAMP_US)); return false; } if (FLAGS_SET(age_by, AGE_BY_BTIME) && btime != NSEC_INFINITY && btime >= cutoff) { - char a[FORMAT_TIMESTAMP_MAX]; log_debug("%s \"%s\": birth time %s is too new.", is_dir ? "Directory" : "File", sub_path, - format_timestamp_style(a, sizeof(a), btime / NSEC_PER_USEC, TIMESTAMP_US)); + FORMAT_TIMESTAMP_STYLE(btime / NSEC_PER_USEC, TIMESTAMP_US)); return false; } @@ -810,13 +806,12 @@ static int dir_cleanup( finish: if (deleted) { - char a[FORMAT_TIMESTAMP_MAX], m[FORMAT_TIMESTAMP_MAX]; struct timespec ts[2]; log_debug("Restoring access and modification time on \"%s\": %s, %s", p, - format_timestamp_style(a, sizeof(a), self_atime_nsec / NSEC_PER_USEC, TIMESTAMP_US), - format_timestamp_style(m, sizeof(m), self_mtime_nsec / NSEC_PER_USEC, TIMESTAMP_US)); + FORMAT_TIMESTAMP_STYLE(self_atime_nsec / NSEC_PER_USEC, TIMESTAMP_US), + FORMAT_TIMESTAMP_STYLE(self_mtime_nsec / NSEC_PER_USEC, TIMESTAMP_US)); timespec_store_nsec(ts + 0, self_atime_nsec); timespec_store_nsec(ts + 1, self_mtime_nsec); @@ -2503,7 +2498,6 @@ static char *age_by_to_string(AgeBy ab, bool is_dir) { } static int clean_item_instance(Item *i, const char* instance) { - char timestamp[FORMAT_TIMESTAMP_MAX]; _cleanup_closedir_ DIR *d = NULL; STRUCT_STATX_DEFINE(sx); int mountpoint, r; @@ -2562,7 +2556,7 @@ static int clean_item_instance(Item *i, const char* instance) { log_debug("Cleanup threshold for %s \"%s\" is %s; age-by: %s%s", mountpoint ? "mount point" : "directory", instance, - format_timestamp_style(timestamp, sizeof(timestamp), cutoff, TIMESTAMP_US), + FORMAT_TIMESTAMP_STYLE(cutoff, TIMESTAMP_US), ab_f, ab_d); }