[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 メーリングリストの案内