ctime.stp timezone patch

Mike Mason mmlnx@us.ibm.com
Mon Oct 30 20:55:00 GMT 2006


I've decided not to check in this change after all.  It does not take daylight savings time changes into account (which some of us experienced this weekend). Upon further review of the kernel code, I'm not convinced that sys_tz is always set. Certainly sys_tz.tz_dsttime doesn't appear to be adjusted automatically.  I think a better approach is to let the script writer adjust for timezone if desired.  Here's an example:

#!/bin/bash

tz=`date "+%z"`
tz_sign=`echo $tz | cut -c1`
tz_hours=`echo $tz | cut -c2-3`
tz_mins=`echo $tz | cut -c4-5`

# Variables preceded by 10# ensures those values are treated as
# decimal numbers. Necessary because bash assumes numbers with
# a leading 0 are octal.
TZ_ADJUST=$tz_sign$((10#$tz_hours*60*60+10#$tz_mins*60))

stap -e '
probe begin 
{
	time = gettimeofday_s() + '$TZ_ADJUST'
	printf("%s\n", ctime(time))
}
'

- Mike

Mike Mason wrote:
> Given that no one has responded, I assume it's okay to check in this 
> change. I'll do so today.
> 
> - Mike Mason
> 
> Mike Mason wrote:
>> The following patch adjusts the output of ctime() for the
>> system timezone. It works for me. Can anyone think of a reason why 
>> this patch should not be included?  Worst case, if
>> sys_tz isn't set for some reason, the result will be GMT
>> as before.
>>
>> - Mike Mason
>>
>>
>> --- src/tapset/ctime.stp    2006-05-11 08:58:41.000000000 -0700
>> +++ src.save2/tapset/ctime.stp    2006-10-21 08:29:44.000000000 -0700
>> @@ -13,8 +13,6 @@
>>  *
>>  * Note that the real C library ctime() function puts a newline ('\n')
>>  * character at the end of the string that this function does not.
>> - * Also note that since the kernel has no concept of timezones, the
>> - * returned time is always in GMT.
>>  *
>>  * This code was adapted from the newlib mktm_r() and asctime_r()
>>  * functions.  In newlib, mktm_r.c states that it was adapted from
>> @@ -24,6 +22,10 @@
>>  * Changes copyright (C) 2006 Red Hat Inc.
>>  */
>>
>> +%{
>> +#include <linux/time.h>
>> +%}
>> +
>> function ctime:string(epochsecs:long)
>> %{
>>
>> @@ -38,6 +40,8 @@
>> #define EPOCH_YEAR      1970
>> #define EPOCH_WDAY      4
>>
>> +extern struct timezone sys_tz;
>> +
>> #define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) 
>> == 0)
>>
>>     static const int mon_lengths[2][MONSPERYEAR] = {
>> @@ -71,7 +75,10 @@
>>     int tm_wday;        /* day of the week */
>>
>>     lcltime = THIS->epochsecs;
>> -   +
>> +    /* adjust for timezone */
>> +    lcltime -= sys_tz.tz_minuteswest * 60;
>> +
>>     days = ((long)lcltime) / SECSPERDAY;
>>     rem = ((long)lcltime) % SECSPERDAY;
>>     while (rem < 0)
>>
> 



More information about the Systemtap mailing list