Clean internal logic, helps for some unusual cases
This commit is contained in:
parent
18704338bb
commit
62be897817
|
@ -159,6 +159,9 @@ again:
|
|||
return 1;
|
||||
}
|
||||
|
||||
stv = NULL;
|
||||
stz = NULL;
|
||||
|
||||
/* correct the kerneltime for this diffs */
|
||||
/* subtract kernel offset, if present, old offset too */
|
||||
|
||||
|
@ -202,21 +205,15 @@ again:
|
|||
tv.tv_usec = 0; /* we are restarting here... */
|
||||
stv = &tv;
|
||||
}
|
||||
else
|
||||
stv = NULL;
|
||||
}
|
||||
else
|
||||
stv = NULL;
|
||||
|
||||
if (tz.tz_dsttime != 0 || tz.tz_minuteswest != 0) {
|
||||
tz.tz_dsttime = tz.tz_minuteswest = 0; /* zone info is garbage */
|
||||
stz = &tz;
|
||||
}
|
||||
else
|
||||
stz = NULL;
|
||||
|
||||
if (stz != NULL || stv != NULL) {
|
||||
if (init && stv != NULL) {
|
||||
/* if init, don't touch RTC at all */
|
||||
if (init) {
|
||||
mib[0] = CTL_MACHDEP;
|
||||
mib[1] = CPU_DISRTCSET;
|
||||
len = sizeof(disrtcset);
|
||||
|
@ -233,14 +230,17 @@ again:
|
|||
}
|
||||
}
|
||||
}
|
||||
/* stz means that kernel zone shifted */
|
||||
/* clock needs adjustment even if !init */
|
||||
if ((init || stz != NULL) && settimeofday(stv, stz)) {
|
||||
|
||||
if (( (init && (stv != NULL || stz != NULL))
|
||||
|| (stz != NULL && stv == NULL)
|
||||
)
|
||||
&& settimeofday(stv, stz)
|
||||
) {
|
||||
syslog(LOG_ERR, "settimeofday: %m");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* init: don't write RTC, !init: write RTC */
|
||||
if (kern_offset != offset) {
|
||||
kern_offset = offset;
|
||||
mib[0] = CTL_MACHDEP;
|
||||
|
@ -255,6 +255,7 @@ again:
|
|||
if (need_restore) {
|
||||
need_restore = 0;
|
||||
disrtcset = 0;
|
||||
len = sizeof(disrtcset);
|
||||
if (sysctl(mib, 2, NULL, NULL, &disrtcset, len) == -1) {
|
||||
syslog(LOG_ERR, "sysctl(restore_disrtcset): %m");
|
||||
return 1;
|
||||
|
|
Loading…
Reference in New Issue