[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:07405] Re: hwclock



佐野@浜松です。

以前、 bo の clock と hamm の hwclock はソースを
追いかけたことがあって興味を持っていたのですが

> いや、これは
> boot時に
> hwclockを使ってlocalな時間を設定している時に
> mktime() failed unexpectedly (rc -1).  Aborting.
> と言うエラーが出て失敗している様です。
> 今はカーネルの再再,,,,構築で問題無くなりました(^^;)。
> #[debian-users:07382]で、解決の方法を書いておきました。

この「失敗する状態」の時に --directisa オプションを
指定したらどうなりますか ?

 util-linux-2.7.1/sysutils/hwclock.c を見ているのですが、

ハードウェアクロックへのアクセス方法に  direct ISA、
 RTC_IOCTL などの種類があり、デバイスファイル /dev/rtc
が存在する場合は RTC_IOCTL を使うようにしています。
(direct ISA は AT clone な機械でのみ有効かつ suid root が
必要とあります。こちらの条件はクリアしていますよね。)

該当する部分を以下に示します。

**************************************************************************
determine_clock_access_method(const bool user_requests_ISA,
                              enum clock_access_method *clock_access_p) {
/*----------------------------------------------------------------------------
  Figure out how we're going to access the hardware clock, by seeing
  what facilities are available, looking at invocation options, and 
  using compile-time constants.

  <user_requests_ISA> means the user explicitly asked for the ISA method.
-----------------------------------------------------------------------------*/
  bool rtc_works;
    /* The /dev/rtc method is available and seems to work on this machine */

  if (got_rtc) {
    int rtc_fd = open("/dev/rtc", O_RDONLY);
    if (rtc_fd > 0) {
      rtc_works = TRUE;
      close(rtc_fd);
    } else {
      rtc_works = FALSE;
      if (debug)
        printf("Open of /dev/rtc failed, errno = %s (%d).  "
               "falling back to more primitive clock access method.\n",
               strerror(errno), errno);
    }
  } else rtc_works = TRUE;

  if (user_requests_ISA) *clock_access_p = ISA;
  else if (rtc_works) *clock_access_p = RTC_IOCTL;
(以下略)

上の関数で RTC_IOCTL が選択された場合、例えば READ の動作では

**************************************************************************
void
read_hardware_clock_rtc_ioctl(struct tm *tm) {
/*----------------------------------------------------------------------------
  Read the hardware clock and return the current time via <tm>
  argument.  Use ioctls to "rtc" device /dev/rtc.
-----------------------------------------------------------------------------*/
#if defined(_MC146818RTC_H)
  int rc;   /* Local return code */
  int rtc_fd;  /* File descriptor of /dev/rtc */

  rtc_fd = open("/dev/rtc",O_RDONLY);
  if (rtc_fd == -1) {
    fprintf(stderr, "open() of /dev/rtc failed, errno = %s (%d).\n",
            strerror(errno), errno);
    exit(5);
  } else {
    /* Read the RTC time/date */
    rc = ioctl(rtc_fd, RTC_RD_TIME, tm);
    if (rc == -1) {
      fprintf(stderr, "ioctl() to /dev/rtc to read the time failed, "
              "errno = %s (%d).\n", strerror(errno), errno);
      exit(5);
    }
    close(rtc_fd);
  }
(以下略)

によって (rc == -1) のエラーが戻るので、現象的には
一致していると思いますがいかがでしょう ?

-- 
 <sano@xxxxxxxxxxxxxxxxxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)