[Armadillo:08507] Re: Windows 上でのタイムスタンプについて
風間
email@hidden
2013年 1月 4日 (金) 16:51:51 JST
風間です。
情報ありがとうございます。
タイムスタンプの問題は何とか過去MLで解決できました。
下記で上手くいったようです。
=======================================================
修正は2点
1) hwclock の修正
2) settimeofday 実行時 第二引き数(timezone) 設定
--------------------------------------------------
1) timezone を参照する前にtzset()を実行しなければならない、
という問題です。
busybox の hwclock に次のパッチをあてる。
--- hwclock.c-orig
+++ hwclock.c
@@ -133,6 +133,8 @@
static int to_sys_clock(int utc)
{
struct timeval tv = { 0, 0 };
+
+ tzset(); // need before referring timezone variable
const struct timezone tz = { timezone/60 - 60*daylight, 0 };
tv. tv_sec = read_rtc ( utc );
hwclock.c の場所は
atmark-dist-20120222/user/busybox/util-linux/hwclock.c
--------------------------------------------------
2) テストで使用したプログラム内容
int main(int argc, char *argv[])
{
struct timeval tv;
struct tm tp;
char wrk_str[10];
int i, cnt;
char *pdata;
// struct timezone tz; //<- 使えないようだ
const struct timezone tz = { -9*60, 0 }; //<- こう書く
if (argc < 2) {
printf("input date\n");
return -1;
}
pdata = argv[1];
i = 0;
//月
for(cnt = 0; cnt < 2; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_mon = strtol(wrk_str, NULL, 10) - 1;//- 1;
//日
for(cnt = 0; cnt < 2; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_mday = strtol(wrk_str, NULL, 10);
//時
for(cnt = 0; cnt < 2; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_hour = strtol(wrk_str, NULL, 10);
//分
for(cnt = 0; cnt < 2; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_min = strtol(wrk_str, NULL, 10);
//年
for(cnt = 0; cnt < 4; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_year = strtol(wrk_str, NULL, 10) - 1900;//-1900
//秒
i++;
for(cnt = 0; cnt < 2; cnt++) { wrk_str[cnt] = pdata[i++]; } wrk_str[cnt]
= 0;
tp.tm_sec = strtol(wrk_str, NULL, 10);
tv.tv_sec = mktime(&tp);
tv.tv_usec = 0;
// tz.minuteswest = -9*60; //-9時間
settimeofday(&tv, &tz);
system("hwclock -w -u"); //UTC で書込み
return 0;
}
=======================================================
ありがとうございました。
> -----Original Message-----
> From: email@hidden
> [mailto:email@hidden] On Behalf Of Yasuhisa
> Nakamura
> Sent: Wednesday, January 02, 2013 11:14 AM
> To: email@hidden
> Subject: [Armadillo:08506] Re: Windows 上でのタイムスタンプについて
>
> 中村です。
>
> settimeofday()に関する情報提供です。
>
> RTCなしのArmadillo-420用に[Armadillo:01366]
> http://lists.atmark-techno.com/pipermail/armadillo/2006-November/00136
> 5.html
> で紹介されているのと同じsettimeofday()する小さなプログラムつくり、
> ATDE3の環境でコンパイルしてみたところ、
> warning: null argument where non-null required (argument 1)
> という警告が出てしまいました。
> (2回settimeofday()しているので2行出ます)
>
> 確か、Armadillo-220用にATDE2でやっていたころはこれはなかったと思います。
>
> 調べてみると、sys/time.hの
> extern int settimeofday (const struct timeval *__tv,
> const struct timezone *__tz)
> __THROW __nonnull ((1));
>
> にあるnullチェックがこの警告を出しているようです。
>
> settimeofday()の第1引数にNULLは許されるはずなので(実際、
> NULLにして動いてますし・・・)、ググってみたところ、
> こんな記事がみつかりました。
>
> 以下、
> http://sourceware-org.1504.n7.nabble.com/PATCH-settimeofday-with-NULL-
> tv-td215278.html
> からまるごと引用
>
> settimeofday (NULL, tz) is used by systemd (and perhaps other code) to
change
> the kernel timezone. Unfortunately, glibc marks the first argument as
> must-be-nonnull. This causes static analyzers to issue incorrect
> diagnostics for such uses of settimeofday.
>
> This patch removes the __nonnull attribute and the bogus diagnostics no
> longer are issued.
>
> diff --git a/ChangeLog b/ChangeLog
> index 638934b..624078b 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,8 @@
> +2012-12-03 Jeff Law <[hidden email]>
> +
> + * time/sys/time.h (settimeofday): Do not mark TV argument as
> + __nonnull.
> +
> 2012-12-01 Mike Frysinger <[hidden email]>
>
> * libio/fileops.c (_IO_new_file_close_it): Do not always flush diff
--git
> a/time/sys/time.h b/time/sys/time.h index 0f5ef5c..f763d96 100644
> --- a/time/sys/time.h
> +++ b/time/sys/time.h
> @@ -77,7 +77,7 @@ extern int gettimeofday (struct timeval *__restrict
__tv,
> This call is restricted to the super-user. */ extern int
settimeofday
> (const struct timeval *__tv,
> const struct timezone *__tz)
> - __THROW __nonnull ((1));
> + __THROW;
>
> /* Adjust the current time of day by the amount in DELTA.
> If OLDDELTA is not NULL, it is filled in with the amount
>
> --
> なかむら
>
armadillo メーリングリストの案内