X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fhwclock.c;h=f9adf0369ea71cc38f23315b43b57d8b66a2dc08;hp=d40bb2653f886b5ef70b70c53d94aaa15d7715b4;hb=f274ece0f76b5709408821e317e87aef76123db6;hpb=bbc98d32560cc456531bf254f7b69054921082bd diff --git a/src/shared/hwclock.c b/src/shared/hwclock.c index d40bb2653..f9adf0369 100644 --- a/src/shared/hwclock.c +++ b/src/shared/hwclock.c @@ -61,10 +61,11 @@ static int rtc_open(int flags) { for (;;) { char *p, *v; - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; int r; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0) goto fallback; @@ -74,7 +75,7 @@ static int rtc_open(int flags) { if (ignore_file(de->d_name)) continue; - p = join("/sys/class/rtc/", de->d_name, "/hctosys", NULL); + p = strjoin("/sys/class/rtc/", de->d_name, "/hctosys", NULL); if (!p) { closedir(d); return -ENOMEM; @@ -93,6 +94,11 @@ static int rtc_open(int flags) { continue; p = strappend("/dev/", de->d_name); + if (!p) { + closedir(d); + return -ENOMEM; + } + fd = open(p, flags); free(p); @@ -154,6 +160,7 @@ int hwclock_set_time(const struct tm *tm) { return err; } + int hwclock_is_localtime(void) { FILE *f; bool local = false; @@ -188,18 +195,18 @@ int hwclock_is_localtime(void) { return local; } -int hwclock_apply_localtime_delta(int *min) { +int hwclock_set_timezone(int *min) { const struct timeval *tv_null = NULL; struct timespec ts; struct tm *tm; - int minuteswest; + int minutesdelta; struct timezone tz; assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); assert_se(tm = localtime(&ts.tv_sec)); - minuteswest = tm->tm_gmtoff / 60; + minutesdelta = tm->tm_gmtoff / 60; - tz.tz_minuteswest = -minuteswest; + tz.tz_minuteswest = -minutesdelta; tz.tz_dsttime = 0; /* DST_NONE*/ /* @@ -210,17 +217,22 @@ int hwclock_apply_localtime_delta(int *min) { if (settimeofday(tv_null, &tz) < 0) return -errno; if (min) - *min = minuteswest; + *min = minutesdelta; return 0; } -int hwclock_reset_localtime_delta(void) { +int hwclock_reset_timezone(void) { const struct timeval *tv_null = NULL; struct timezone tz; tz.tz_minuteswest = 0; tz.tz_dsttime = 0; /* DST_NONE*/ + /* + * The very first time we set the kernel's timezone, it will warp + * the clock. Do a dummy call here, so the time warping is sealed + * and we set only the time zone with next call. + */ if (settimeofday(tv_null, &tz) < 0) return -errno;