Module Name: src
Committed By: christos
Date: Sun Oct 16 17:59:32 UTC 2011
Modified Files:
src/lib/libc/time: Makefile ctime.3 localtime.c
Log Message:
Add code (not enabled) that allows mktime() to return a value for times
in the DST gap when tm_isdst == -1, like glibc does. Document both behaviors.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/time/Makefile
cvs rdiff -u -r1.42 -r1.43 src/lib/libc/time/ctime.3
cvs rdiff -u -r1.58 -r1.59 src/lib/libc/time/localtime.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/time/Makefile
diff -u src/lib/libc/time/Makefile:1.4 src/lib/libc/time/Makefile:1.5
--- src/lib/libc/time/Makefile:1.4 Sun Sep 4 06:10:26 2011
+++ src/lib/libc/time/Makefile Sun Oct 16 13:59:32 2011
@@ -113,6 +113,8 @@ LDLIBS=
# -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU=1
# if you do not want run time warnings about formats that may cause
# year 2000 grief
+# -DNO_ERROR_IN_DST_GAP=1
+# if you want mktime() not to return an error in the DST gap.
# -DZIC_MAX_ABBR_LEN_WO_WARN=3
# (or some other number) to set the maximum time zone abbreviation length
# that zic will accept without a warning (the default is 6)
Index: src/lib/libc/time/ctime.3
diff -u src/lib/libc/time/ctime.3:1.42 src/lib/libc/time/ctime.3:1.43
--- src/lib/libc/time/ctime.3:1.42 Sat Jul 9 05:12:11 2011
+++ src/lib/libc/time/ctime.3 Sun Oct 16 13:59:32 2011
@@ -1,8 +1,8 @@
-.\" $NetBSD: ctime.3,v 1.42 2011/07/09 09:12:11 plunky Exp $
+.\" $NetBSD: ctime.3,v 1.43 2011/10/16 17:59:32 christos Exp $
.\"
.\" XXX: Lincense missing?
.\"
-.Dd July 9, 2011
+.Dd October 16, 2011
.Dt CTIME 3
.Os
.Sh NAME
@@ -245,6 +245,19 @@ are determined.
The function returns the specified calendar time;
if the calendar time cannot be represented, it returns
.Va "(time_t)-1" .
+This can happen either because the resulting conversion would not fit
+in a
+.Vt time_t
+variable, or because the time specified happens to be in the daylight
+savings gap and
+.Fa tm_isdst
+was set to
+.Dv \-1 .
+Other
+.Fn mktime
+implementations do not return an error in the second case and return
+the appropriate time offset after the daylight savings gap.
+There is code to mimick this behavior, but it is not enabled by default.
.It Fn mktime_z "tz" "tm"
The
.Fn mktime_z
Index: src/lib/libc/time/localtime.c
diff -u src/lib/libc/time/localtime.c:1.58 src/lib/libc/time/localtime.c:1.59
--- src/lib/libc/time/localtime.c:1.58 Sun Sep 4 06:10:26 2011
+++ src/lib/libc/time/localtime.c Sun Oct 16 13:59:32 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: localtime.c,v 1.58 2011/09/04 10:10:26 christos Exp $ */
+/* $NetBSD: localtime.c,v 1.59 2011/10/16 17:59:32 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
@@ -10,7 +10,7 @@
#if 0
static char elsieid[] = "@(#)localtime.c 8.17";
#else
-__RCSID("$NetBSD: localtime.c,v 1.58 2011/09/04 10:10:26 christos Exp $");
+__RCSID("$NetBSD: localtime.c,v 1.59 2011/10/16 17:59:32 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -1912,6 +1912,27 @@ time2sub(const timezone_t sp, struct tm
return WRONG;
--hi;
}
+#ifdef NO_ERROR_IN_DST_GAP
+ if (lo - 1 == hi && yourtm.tm_isdst < 0) {
+ time_t off = 0;
+ for (i = sp->typecnt - 1; i >= 0; --i) {
+ for (j = sp->typecnt - 1; j >= 0; --j) {
+ if (sp->ttis[j].tt_isdst ==
+ sp->ttis[i].tt_isdst)
+ continue;
+ off = sp->ttis[j].tt_gmtoff -
+ sp->ttis[i].tt_gmtoff;
+ break;
+ }
+ if (j >= 0)
+ break;
+ }
+ if (off) {
+ t = hi + off;
+ break;
+ }
+ }
+#endif
if (lo > hi)
return WRONG;
if (dir > 0)