[systemd-devel] [PATCH] fix bogus boot error message
Kelly Anderson
kelly at silka.with-linux.com
Tue Jul 19 06:37:21 PDT 2011
On 07/19/11 06:29, Kay Sievers wrote:
> On Tue, Jul 19, 2011 at 14:20, Kelly Anderson
> <kelly at silka.with-linux.com> wrote:
>> On 07/19/11 06:04, Kay Sievers wrote:
>>> On Tue, Jul 19, 2011 at 13:22, Kelly Anderson
>>> <kelly at silka.with-linux.com> wrote:
>>>> The following commit introduces a bogus error message on boot since
>>>> localtime may be a negative number, i.e. GMT-7.
>>>> The following patch just uses errno directly rather than using it
>>>> indirectly
>>>> through hwclock_apply_localtime_delta():
>>> Ah, tm->tm_gmtoff can be negative.
>>>
>>>> + errno = 0;
>>>> min = hwclock_apply_localtime_delta();
>>> We usually prefer to return the errno instead of mangling it at the
>>> caller's side, and have the values that can be negative passed as
>>> arguments. Mind switching that? Or let me know.
>>>
>>> Thanks,
>>> Kay
>> Something along the lines of:
>>
>> int status = hwclock_apply_localtime_delta(&min)
>>
>> Is that what you mean? If that's what you're looking for, I could do that.
> Yeah, we like to return errno-like values directly wherever possible.
> It's a bit like the kernel's function style. Only things that can only
> fail in one way only, like ENOMEM, can return the object or the NULL
> pointer.
>
> That means we need to pass the values as arguments. In timedated.c the
> value isn't even used, so allowing hwclock_apply_localtime_delta(NULL)
> might be nice.
>
> Kay
>
> Kay
OK,
Here's a patch that should have the desired results:
--- ./src/util.h.orig 2011-07-11 20:07:58.000000000 -0600
+++ ./src/util.h 2011-07-19 07:24:50.593040702 -0600
@@ -435,7 +435,7 @@ int conf_files_list(char ***strv, const
int hwclock_is_localtime(void);
-int hwclock_apply_localtime_delta(void);
+int hwclock_apply_localtime_delta(int *min);
int hwclock_reset_localtime_delta(void);
int hwclock_get_time(struct tm *tm);
int hwclock_set_time(const struct tm *tm);
--- ./src/main.c.orig 2011-07-11 20:07:58.000000000 -0600
+++ ./src/main.c 2011-07-19 07:28:27.362064963 -0600
@@ -1058,9 +1058,9 @@ int main(int argc, char *argv[]) {
if (hwclock_is_localtime() > 0) {
int min;
- min = hwclock_apply_localtime_delta();
- if (min < 0)
- log_error("Failed to apply local time
delta: %s", strerror(-min));
+ int rc = hwclock_apply_localtime_delta(&min);
+ if (rc < 0)
+ log_error("Failed to apply local time
delta: %s", strerror(-rc));
else
log_info("RTC configured in localtime,
applying delta of %i minutes to system time.", min);
}
--- ./src/util.c.orig 2011-07-11 20:07:58.000000000 -0600
+++ ./src/util.c 2011-07-19 07:29:04.300728483 -0600
@@ -4905,7 +4905,7 @@ int hwclock_is_localtime(void) {
return local;
}
-int hwclock_apply_localtime_delta(void) {
+int hwclock_apply_localtime_delta(int *min) {
const struct timeval *tv_null = NULL;
struct timespec ts;
struct tm *tm;
@@ -4916,6 +4916,9 @@ int hwclock_apply_localtime_delta(void)
assert_se(tm = localtime(&ts.tv_sec));
minuteswest = tm->tm_gmtoff / 60;
+ if ( min )
+ *min = minuteswest;
+
tz.tz_minuteswest = -minuteswest;
tz.tz_dsttime = 0; /* DST_NONE*/
@@ -4924,10 +4927,7 @@ int hwclock_apply_localtime_delta(void)
* The very first time we set the kernel's timezone, it will warp
* the clock so that it runs in UTC instead of local time.
*/
- if (settimeofday(tv_null, &tz) < 0)
- return -errno;
-
- return minuteswest;
+ return (settimeofday(tv_null, &tz) < 0) ? -errno : 0;
}
int hwclock_reset_localtime_delta(void) {
--- ./src/timedated.c.orig 2011-06-29 17:59:24.000000000 -0600
+++ ./src/timedated.c 2011-07-19 07:27:24.959633340 -0600
@@ -332,7 +332,7 @@ static DBusHandlerResult timedate_messag
struct tm *tm;
/* 2. Teach kernel new timezone */
- hwclock_apply_localtime_delta();
+ hwclock_apply_localtime_delta(NULL);
/* 3. Sync RTC from system clock, with
the new delta */
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
@@ -382,7 +382,7 @@ static DBusHandlerResult timedate_messag
/* 2. Teach kernel new timezone */
if (local_rtc)
- hwclock_apply_localtime_delta();
+ hwclock_apply_localtime_delta(NULL);
else
hwclock_reset_localtime_delta();
More information about the systemd-devel
mailing list