[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 (佐野 武俊)