1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-10-21 20:38:45 +00:00

Fix a problem where the timezone would reset to UTC when switching views.

Thanks to William Bloom <wbloom@eldocomp.com> for finding the catalyst that
causes this.

PR:		55409
Obtained from:	libical-0.24
This commit is contained in:
Joe Marcus Clarke 2003-08-27 16:45:56 +00:00
parent 084f1296c2
commit 4e80c5ec0a
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=87798
2 changed files with 107 additions and 0 deletions

View File

@ -7,6 +7,7 @@
PORTNAME= evolution
PORTVERSION= 1.4.4
PORTREVISION= 1
CATEGORIES= mail gnome
MASTER_SITES= ${MASTER_SITE_GNOME} \
http://people.FreeBSD.org/~sobomax/:local

View File

@ -0,0 +1,106 @@
--- libical/src/libical/icaltime.c.orig Tue Aug 26 20:25:02 2003
+++ libical/src/libical/icaltime.c Tue Aug 26 20:29:05 2003
@@ -46,6 +46,76 @@
#include "icaltimezone.h"
+static time_t make_time(struct tm *tm, int tzm)
+{
+ time_t tim;
+
+ static int days[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
+
+ /* check that year specification within range */
+
+ if (tm->tm_year < 70 || tm->tm_year > 138)
+ return((time_t) -1);
+
+ /* check that month specification within range */
+
+ if (tm->tm_mon < 0 || tm->tm_mon > 11)
+ return((time_t) -1);
+
+ /* check for upper bound of Jan 17, 2038 (to avoid possibility of
+ 32-bit arithmetic overflow) */
+
+ if (tm->tm_year == 138) {
+ if (tm->tm_mon > 0)
+ return((time_t) -1);
+ else if (tm->tm_mday > 17)
+ return((time_t) -1);
+ }
+
+ /*
+ * calculate elapsed days since start of the epoch (midnight Jan
+ * 1st, 1970 UTC) 17 = number of leap years between 1900 and 1970
+ * (number of leap days to subtract)
+ */
+
+ tim = (tm->tm_year - 70) * 365 + ((tm->tm_year - 1) / 4) - 17;
+
+ /* add number of days elapsed in the current year */
+
+ tim += days[tm->tm_mon];
+
+ /* check and adjust for leap years (the leap year check only valid
+ during the 32-bit era */
+
+ if ((tm->tm_year & 3) == 0 && tm->tm_mon > 1)
+ tim += 1;
+
+ /* elapsed days to current date */
+
+ tim += tm->tm_mday;
+
+
+ /* calculate elapsed hours since start of the epoch */
+
+ tim = tim * 24 + tm->tm_hour;
+
+ /* calculate elapsed minutes since start of the epoch */
+
+ tim = tim * 60 + tm->tm_min;
+
+ /* adjust per time zone specification */
+
+ tim -= tzm;
+
+ /* calculate elapsed seconds since start of the epoch */
+
+ tim = tim * 60 + tm->tm_sec;
+
+ /* return number of seconds since start of the epoch */
+
+ return(tim);
+}
+
struct icaltimetype
icaltime_from_timet(time_t tm, int is_date)
@@ -221,13 +291,7 @@
stm.tm_year = tt.year-1900;
stm.tm_isdst = -1;
- if(tt.is_utc == 1 || tt.is_date == 1){
- char *old_tz = set_tz("UTC");
- t = mktime(&stm);
- unset_tz(old_tz);
- } else {
- t = mktime(&stm);
- }
+ t = make_time(&stm, 0);
return t;
@@ -269,10 +333,7 @@
stm.tm_year = tt.year-1900;
stm.tm_isdst = -1;
- /* Set TZ to UTC and use mktime to convert to a time_t. */
- old_tz = set_tz ("UTC");
- t = mktime (&stm);
- unset_tz (old_tz);
+ t = make_time(&stm, 0);
return t;
}