Date: Mon, 30 Mar 1998 13:02:27 +0200 (MET DST) From: Wolfgang Helbig <helbig@Informatik.BA-Stuttgart.DE> To: ache@FreeBSD.ORG (Andrey A. Chernov) Cc: freebsd-bugs@FreeBSD.ORG Subject: Re: bin/6164 Message-ID: <199803301102.NAA22390@rvc1.informatik.ba-stuttgart.de> In-Reply-To: <199803300920.BAA08095@freefall.freebsd.org> from "Andrey A. Chernov" at "Mar 30, 98 01:20:30 am"
next in thread | previous in thread | raw e-mail | index | archive | help
> Synopsis: adjkerntz failed
>
> State-Changed-From-To: open-closed
> State-Changed-By: ache
> State-Changed-When: Mon Mar 30 01:18:05 PST 1998
> State-Changed-Why:
> crontab changed to run adjkerntz -a at 05:01 too
Hmm. The reason for this warning message (``non existent UCT time'')
is an erraneous use of mktime(3): mktime(3) *always* assumes
that the passed tm structure (utc) holds *local* time, even if the
parameter is filled by gmtime(3).
At March 29th 4:01 CEST gmtime() put 2:01 into utc, which is correct.
Then mktime(3) assumes March 29th 2:01 *local* time which does not exist.
(In Germany March 29th 1:59 CET is followed by March 29th 3:00 CEST)
A fix is to use local.tm_gmtoff to get UTC-time from local time, as in
this diff:
This works in FreeBSD 3.0 and FreeBSD 2.2.5:
Wolfgang
Index: adjkerntz.c
===================================================================
RCS file: /usr/cvsroot/src/sbin/adjkerntz/adjkerntz.c,v
retrieving revision 1.21
diff -u -r1.21 adjkerntz.c
--- adjkerntz.c 1998/02/25 09:40:21 1.21
+++ adjkerntz.c 1998/03/30 10:29:06
@@ -71,7 +71,7 @@
int argc;
char **argv;
{
- struct tm local, utc;
+ struct tm local;
struct timeval tv, *stv;
struct timezone tz, *stz;
int kern_offset, wall_clock, disrtcset;
@@ -161,13 +161,12 @@
local = *localtime(&initial_sec);
if (diff == 0)
initial_isdst = local.tm_isdst;
- utc = *gmtime(&initial_sec);
- local.tm_isdst = utc.tm_isdst = initial_isdst;
+ local.tm_isdst = initial_isdst;
/* calculate local CMOS diff from GMT */
- utcsec = mktime(&utc);
localsec = mktime(&local);
+ utcsec = localsec - local.tm_gmtoff;
if (utcsec == -1 || localsec == -1) {
/*
* XXX user can only control local time, and it is
@@ -217,11 +216,10 @@
initial_isdst = final_isdst;
goto recalculate;
}
- utc = *gmtime(&final_sec);
- local.tm_isdst = utc.tm_isdst = final_isdst;
+ local.tm_isdst = final_isdst;
- utcsec = mktime(&utc);
localsec = mktime(&local);
+ utcsec = localsec - local.tm_gmtoff;
if (utcsec == -1 || localsec == -1) {
bad_final:
/*
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199803301102.NAA22390>
