system: fix localtime value in ubus info method output
authorRafał Miłecki <zajec5@gmail.com>
Tue, 5 Jul 2016 13:40:56 +0000 (15:40 +0200)
committerJohn Crispin <john@phrozen.org>
Tue, 5 Jul 2016 20:16:43 +0000 (22:16 +0200)
Function mktime respects current time zone and calling it results in
converting time back to the UTC. It means we were never returning a
time for local zone but GMT one.

The easiest solution is to use tm_gmtoff from struct tm. Unfortunately
this isn't part of POSIX but it seems to be the best idea anyway.

Alternative (worse?) solutions:
1) Use timegm that is nonstandard GNU extension
2) Work with TZ env (getenv & (un)setenv) that is not thread-safe
3) Use timegm (next to localtime) and implement function comparing two
   struct tm. This is what glibc does internally (tm_diff) when compiled
   without HAVE_TM_GMTOFF.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
system.c

index 504cdc02f012af778aadd150def1949e8db3d148..569a75d5b4df947c0166afe4b14855073a968188 100644 (file)
--- a/system.c
+++ b/system.c
@@ -205,7 +205,7 @@ static int system_info(struct ubus_context *ctx, struct ubus_object *obj,
 
        blob_buf_init(&b, 0);
 
-       blobmsg_add_u32(&b, "localtime", mktime(tm));
+       blobmsg_add_u32(&b, "localtime", now + tm->tm_gmtoff);
 
 #ifdef linux
        blobmsg_add_u32(&b, "uptime",    info.uptime);