[systemd-devel] [PATCH] journalctl: make --utc work everywhere

Jan Synacek jsynacek at redhat.com
Wed Oct 8 22:31:49 PDT 2014


Lennart Poettering <lennart at poettering.net> writes:
> On Fri, 03.10.14 09:51, Jan Synacek (jsynacek at redhat.com) wrote:
>
>> The --utc option was introduced by commit
>> 9fd290443f5f99fca0dcd4216b1de70f7d3b8db1.
>> Howerver, the implementation was incomplete.
>> ---
>>  src/journal/journalctl.c | 14 +++++++-------
>>  src/shared/logs-show.c   |  2 +-
>>  src/shared/time-util.c   | 19 +++++++++++++++----
>>  src/shared/time-util.h   |  3 ++-
>>  4 files changed, 25 insertions(+), 13 deletions(-)
>> 
>> diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
>> index 395f85c..816934e 100644
>> --- a/src/journal/journalctl.c
>> +++ b/src/journal/journalctl.c
>> @@ -890,8 +890,8 @@ static int list_boots(sd_journal *j) {
>>                  printf("% *i " SD_ID128_FORMAT_STR " %s—%s\n",
>>                         w, i - count + 1,
>>                         SD_ID128_FORMAT_VAL(id->id),
>> -                       format_timestamp(a, sizeof(a), id->first),
>> -                       format_timestamp(b, sizeof(b), id->last));
>> +                       format_timestamp_internal(a, sizeof(a), id->first, arg_utc),
>> +                       format_timestamp_internal(b, sizeof(b), id->last, arg_utc));
>>          }
>>  
>>          return 0;
>> @@ -1502,8 +1502,8 @@ static int verify(sd_journal *j) {
>>                          if (arg_verify_key && JOURNAL_HEADER_SEALED(f->header)) {
>>                                  if (validated > 0) {
>>                                          log_info("=> Validated from %s to %s, final %s entries not sealed.",
>> -                                                 format_timestamp(a, sizeof(a), first),
>> -                                                 format_timestamp(b, sizeof(b), validated),
>> +                                                 format_timestamp_internal(a, sizeof(a), first, arg_utc),
>> +                                                 format_timestamp_internal(b, sizeof(b), validated, arg_utc),
>>                                                   format_timespan(c, sizeof(c), last > validated ? last - validated : 0, 0));
>>                                  } else if (last > 0)
>>                                          log_info("=> No sealing yet, %s of entries not sealed.",
>> @@ -1898,11 +1898,11 @@ int main(int argc, char *argv[]) {
>>                  if (r > 0) {
>>                          if (arg_follow)
>>                                  printf("-- Logs begin at %s. --\n",
>> -                                       format_timestamp(start_buf, sizeof(start_buf), start));
>> +                                       format_timestamp_internal(start_buf, sizeof(start_buf), start, arg_utc));
>>                          else
>>                                  printf("-- Logs begin at %s, end at %s. --\n",
>> -                                       format_timestamp(start_buf, sizeof(start_buf), start),
>> -                                       format_timestamp(end_buf, sizeof(end_buf), end));
>> +                                       format_timestamp_internal(start_buf, sizeof(start_buf), start, arg_utc),
>> +                                       format_timestamp_internal(end_buf, sizeof(end_buf), end, arg_utc));
>>                  }
>>          }
>>  
>> diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
>> index d5d9d09..e30e686 100644
>> --- a/src/shared/logs-show.c
>> +++ b/src/shared/logs-show.c
>> @@ -447,7 +447,7 @@ static int output_verbose(
>>          }
>>  
>>          fprintf(f, "%s [%s]\n",
>> -                format_timestamp_us(ts, sizeof(ts), realtime),
>> +                format_timestamp_us(ts, sizeof(ts), realtime, flags & OUTPUT_UTC),
>>                  cursor);
>>  
>>          JOURNAL_FOREACH_DATA_RETVAL(j, data, length, r) {
>> diff --git a/src/shared/time-util.c b/src/shared/time-util.c
>> index 066ef97..09f4a21 100644
>> --- a/src/shared/time-util.c
>> +++ b/src/shared/time-util.c
>> @@ -152,7 +152,7 @@ struct timeval *timeval_store(struct timeval *tv, usec_t u) {
>>          return tv;
>>  }
>>  
>> -char *format_timestamp(char *buf, size_t l, usec_t t) {
>> +char *format_timestamp_internal(char *buf, size_t l, usec_t t, bool utc) {
>>          struct tm tm;
>>          time_t sec;
>>  
>> @@ -164,13 +164,21 @@ char *format_timestamp(char *buf, size_t l, usec_t t) {
>>  
>>          sec = (time_t) (t / USEC_PER_SEC);
>>  
>> -        if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S %Z", localtime_r(&sec, &tm)) <= 0)
>> +        if (utc)
>> +                gmtime_r(&sec, &tm);
>> +        else
>> +                localtime_r(&sec, &tm);
>> +        if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S %Z", &tm) <= 0)
>>                  return NULL;
>>  
>>          return buf;
>>  }
>>  
>> -char *format_timestamp_us(char *buf, size_t l, usec_t t) {
>> +char *format_timestamp(char *buf, size_t l, usec_t t) {
>> +        return format_timestamp_internal(buf, l, t, false);
>> +}
>> +
>> +char *format_timestamp_us(char *buf, size_t l, usec_t t, bool utc) {
>>          struct tm tm;
>>          time_t sec;
>>  
>> @@ -181,7 +189,10 @@ char *format_timestamp_us(char *buf, size_t l, usec_t t) {
>>                  return NULL;
>>  
>>          sec = (time_t) (t / USEC_PER_SEC);
>> -        localtime_r(&sec, &tm);
>> +        if (utc)
>> +                gmtime_r(&sec, &tm);
>> +        else
>> +                localtime_r(&sec, &tm);
>>  
>>          if (strftime(buf, l, "%a %Y-%m-%d %H:%M:%S", &tm) <= 0)
>>                  return NULL;
>> diff --git a/src/shared/time-util.h b/src/shared/time-util.h
>> index 8ba1cfe..16cc593 100644
>> --- a/src/shared/time-util.h
>> +++ b/src/shared/time-util.h
>> @@ -84,8 +84,9 @@ struct timespec *timespec_store(struct timespec *ts, usec_t u);
>>  usec_t timeval_load(const struct timeval *tv) _pure_;
>>  struct timeval *timeval_store(struct timeval *tv, usec_t u);
>>  
>> +char *format_timestamp_internal(char *buf, size_t l, usec_t t, bool utc);
>>  char *format_timestamp(char *buf, size_t l, usec_t t);
>> -char *format_timestamp_us(char *buf, size_t l, usec_t t);
>> +char *format_timestamp_us(char *buf, size_t l, usec_t t, bool utc);
>>  char *format_timestamp_relative(char *buf, size_t l, usec_t t);
>>  char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
>
> Hmm, we really shouldn't export functions that have are named
> "internal"... 
>
> I have now changed this around a bit, so that we always have two
> flavours of the timestamp formatters, one function to format in local
> time, and one in UTC. 

Ok, thanks for fixing it.

-- 
Jan Synacek
Software Engineer, Red Hat


More information about the systemd-devel mailing list