aboutsummaryrefslogtreecommitdiffstats
path: root/lib/misc.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-04-14 11:27:50 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2010-04-14 11:27:50 +0200
commit21c87a78f1c01fe24610a5d05a65e52bd8eaa796 (patch)
treec4d95580134610222f8a2630d386be460fa74bb4 /lib/misc.c
parent81186cab101fa8c2f82137014d0b3c060b658cb0 (diff)
parent156bbd7b66cf29220c2ff6a86217c4dec5e33765 (diff)
Merging loads of stuff from mainline.
Diffstat (limited to 'lib/misc.c')
-rw-r--r--lib/misc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/misc.c b/lib/misc.c
index fa5bb9a4..b6737551 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -78,6 +78,41 @@ time_t get_time(int year, int month, int day, int hour, int min, int sec)
return mktime(&tm);
}
+time_t mktime_utc( struct tm *tp )
+{
+ struct tm utc;
+ time_t res, tres;
+
+ tp->tm_isdst = -1;
+ res = mktime( tp );
+ /* Problem is, mktime() just gave us the GMT timestamp for the
+ given local time... While the given time WAS NOT local. So
+ we should fix this now.
+
+ Now I could choose between messing with environment variables
+ (kludgy) or using timegm() (not portable)... Or doing the
+ following, which I actually prefer...
+
+ tzset() may also work but in other places I actually want to
+ use local time.
+
+ FFFFFFFFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUU!! */
+ gmtime_r( &res, &utc );
+ utc.tm_isdst = -1;
+ if( utc.tm_hour == tp->tm_hour && utc.tm_min == tp->tm_min )
+ /* Sweet! We're in UTC right now... */
+ return res;
+
+ tres = mktime( &utc );
+ res += res - tres;
+
+ /* Yes, this is a hack. And it will go wrong around DST changes.
+ BUT this is more likely to be threadsafe than messing with
+ environment variables, and possibly more portable... */
+
+ return res;
+}
+
typedef struct htmlentity
{
char code[7];