[Crash-utility] [PATCH] Append time zone to output of date and time

Mathias Krause minipli at grsecurity.net
Thu Aug 20 08:53:28 UTC 2020


Am 20.08.20 um 03:54 schrieb HAGIO KAZUHITO(萩尾 一仁):
> Hi Mathias,
> 
> Thanks for the review!
> 
> -----Original Message-----
>> Hi Kazuhito,
>>
>> Am 19.08.20 um 08:32 schrieb HAGIO KAZUHITO(萩尾 一仁):
>>> Currently it's not easy to distinguish which time zone the output of
>>> DATE uses:
>>>
>>>   crash> sys | grep DATE
>>>         DATE: Thu Nov 29 06:44:02 2018
>>>
>>> Let's introduce ctime_tz() function like ctime() but explicitly appends
>>> the time zone to its result string.
>>>
>>>         DATE: Thu Nov 29 06:44:02 JST 2018
>>>
>>> Resolves: https://github.com/crash-utility/crash/issues/62
>>> Suggested-by: Jacob Wen <jian.w.wen at oracle.com>
>>> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
>>> ---
>>>  defs.h   |  1 +
>>>  help.c   |  3 +--
>>>  kernel.c | 16 ++++++----------
>>>  tools.c  | 28 ++++++++++++++++++++++++++++
>>>  4 files changed, 36 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/defs.h b/defs.h
>>> index 17e98763362b..e7dec7c672a6 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -5096,6 +5096,7 @@ char *strdupbuf(char *);
>>>  void sigsetup(int, void *, struct sigaction *, struct sigaction *);
>>>  #define SIGACTION(s, h, a, o) sigsetup(s, h, a, o)
>>>  char *convert_time(ulonglong, char *);
>>> +char *ctime_tz(time_t *);
>>>  void stall(ulong);
>>>  char *pages_to_size(ulong, char *);
>>>  int clean_arg(void);
>>> diff --git a/help.c b/help.c
>>> index b707cfa58826..d3427a36829f 100644
>>> --- a/help.c
>>> +++ b/help.c
>>> @@ -9299,8 +9299,7 @@ display_README(void)
>>>  			fprintf(fp, "    GNU gdb %s\n", pc->gdb_version);
>>>  		} else if (STREQ(README[i], README_DATE)) {
>>>      			time(&time_now);
>>> -        		fprintf(fp, "            DATE: %s\n",
>>> -                		strip_linefeeds(ctime(&time_now)));
>>> +			fprintf(fp, "            DATE: %s\n", ctime_tz(&time_now));
>>>  		} else if (STREQ(README[i], README_HELP_MENU)) {
>>>  			display_help_screen("    ");
>>>  		} else if (STREQ(README[i], README_GPL_INFO)) {
>>> diff --git a/kernel.c b/kernel.c
>>> index f179375f2d3d..92bfe6329900 100644
>>> --- a/kernel.c
>>> +++ b/kernel.c
>>> @@ -225,10 +225,9 @@ kernel_init()
>>>  	get_xtime(&kt->date);
>>>  	if (CRASHDEBUG(1))
>>>  		fprintf(fp, "xtime timespec.tv_sec: %lx: %s\n",
>>> -			kt->date.tv_sec, strip_linefeeds(ctime(&kt->date.tv_sec)));
>>> +			kt->date.tv_sec, ctime_tz(&kt->date.tv_sec));
>>>  	if (kt->flags2 & GET_TIMESTAMP) {
>>> -		fprintf(fp, "%s\n\n",
>>> -			strip_linefeeds(ctime(&kt->date.tv_sec)));
>>> +		fprintf(fp, "%s\n\n", ctime_tz(&kt->date.tv_sec));
>>>  		clean_exit(0);
>>>  	}
>>>
>>> @@ -5178,7 +5177,7 @@ dump_log_entry(char *logptr, int msg_flags)
>>>  		rem = (ulonglong)ts_nsec % (ulonglong)1000000000;
>>>  		if (msg_flags & SHOW_LOG_CTIME) {
>>>  			time_t t = kt->boot_date.tv_sec + nanos;
>>> -			sprintf(buf, "[%s] ", strip_linefeeds(ctime(&t)));
>>> +			sprintf(buf, "[%s] ", ctime_tz(&t));
>>>  		}
>>>  		else
>>>  			sprintf(buf, "[%5lld.%06ld] ", nanos, rem/1000);
>>> @@ -5553,8 +5552,7 @@ display_sys_stats(void)
>>>
>>>  	if (ACTIVE())
>>>  		get_xtime(&kt->date);
>>> -        fprintf(fp, "        DATE: %s\n",
>>> -		strip_linefeeds(ctime(&kt->date.tv_sec)));
>>> +        fprintf(fp, "        DATE: %s\n", ctime_tz(&kt->date.tv_sec));
>>>          fprintf(fp, "      UPTIME: %s\n", get_uptime(buf, NULL));
>>>          fprintf(fp, "LOAD AVERAGE: %s\n", get_loadavg(buf));
>>>  	fprintf(fp, "       TASKS: %ld\n", RUNNING_TASKS());
>>> @@ -6043,10 +6041,8 @@ dump_kernel_table(int verbose)
>>>  		kt->source_tree : "(not used)");
>>>  	if (!(pc->flags & KERNEL_DEBUG_QUERY) && ACTIVE())
>>>  		get_xtime(&kt->date);
>>> -        fprintf(fp, "          date: %s\n",
>>> -                strip_linefeeds(ctime(&kt->date.tv_sec)));
>>> -        fprintf(fp, "    boot_ date: %s\n",
>>> -                strip_linefeeds(ctime(&kt->boot_date.tv_sec)));
>>> +        fprintf(fp, "          date: %s\n", ctime_tz(&kt->date.tv_sec));
>>> +        fprintf(fp, "     boot_date: %s\n", ctime_tz(&kt->boot_date.tv_sec));
>>>          fprintf(fp, "  proc_version: %s\n", strip_linefeeds(kt->proc_version));
>>>          fprintf(fp, "   new_utsname: \n");
>>>          fprintf(fp, "      .sysname: %s\n", uts->sysname);
>>> diff --git a/tools.c b/tools.c
>>> index 85c81668e40e..4654e7458a3e 100644
>>> --- a/tools.c
>>> +++ b/tools.c
>>> @@ -6318,6 +6318,34 @@ convert_time(ulonglong count, char *buf)
>>>  }
>>>
>>>  /*
>>> + * Convert a calendar time into a null-terminated string like ctime(), but
>>> + * the result string contains the time zone string and does not ends with a
>>> + * linefeed ('\n').
>>> + *
>>> + * NOTE: The return value points to a statically allocated string which is
>>> + * overwritten by subsequent calls.
>>> + */
>>> +char *
>>> +ctime_tz(time_t *timep)
>>> +{
>>> +	static char buf[64];
>>> +	struct tm *tm;
>>> +	size_t size;
>>> +
>>> +	tm = localtime(timep);
>>
>>> +	if (!tm) {
>>> +		snprintf(buf, sizeof(buf), "%ld", *timep);
>>> +		return buf;
>>> +	}
>>
>> I don't think this is especially useful, better fall back to ctime() in
>> this case, but see below.
> 
> but if tm is NULL, then the fallback ctime() also will return NULL
> because ctime(t) is equivalent to asctime(localtime(t)).
> Aren't "UNIX seconds since epoch" better than "(null)" ?

Valid point! Agreed.

>>> +
>>> +	size = strftime(buf, sizeof(buf), "%a %b %e %T %Z %Y", tm);
>>> +	if (!size)
>>> +		return strip_linefeeds(ctime(timep));
>>
>> Maybe you should mention in the leading comment that this function falls
>> back to ctime() in case it fails to generate a timestamp with the time
>> zone info?
> 
> Agreed, will do in v2.

Thanks,
Mathias

> 
> Thanks,
> Kazu
> 
>>
>>> +
>>> +	return buf;
>>> +}
>>> +
>>> +/*
>>>   *  Stall for a number of microseconds.
>>>   */
>>>  void
>>
>> So, to simplify ctime_tz() and avoid the "UNIX seconds since epoch" case
>> I'd suggest something like this instead:
>>
>>   char *
>>   ctime_tz(time_t *timep)
>>   {
>>   	static char buf[64];
>>   	struct tm *tm;
>>
>>   	tm = localtime(timep);
>>   	if (tm && strftime(buf, sizeof(buf), "%a %b %e %T %Z %Y", tm))
>>   		return buf;
>>
>>   	return strip_linefeeds(ctime(timep));
>>   }
>>
>> Beside that, patch looks good to me!
>>
>> Thanks,
>> Mathias





More information about the Crash-utility mailing list