diff --git a/src/server.c b/src/server.c index d6c6dc3a..f92a75b5 100644 --- a/src/server.c +++ b/src/server.c @@ -1526,7 +1526,7 @@ void initServerConfig(void) { server.runid[CONFIG_RUN_ID_SIZE] = '\0'; changeReplicationId(); clearReplicationId2(); - server.timezone = timezone; /* Initialized by tzset(). */ + server.timezone = getTimeZone(); /* Initialized by tzset(). */ server.configfile = NULL; server.executable = NULL; server.config_hz = CONFIG_DEFAULT_HZ; diff --git a/src/util.c b/src/util.c index 3fa6c924..c2d32df8 100644 --- a/src/util.c +++ b/src/util.c @@ -652,6 +652,24 @@ sds getAbsolutePath(char *filename) { return abspath; } +/* + * Gets the proper timezone in a more portable fashion + * i.e timezone variables are linux specific. + */ + +unsigned long getTimeZone(void) { +#ifdef __linux__ + return timezone; +#else + struct timeval tv; + struct timezone tz; + + gettimeofday(&tv, &tz); + + return tz.tz_minuteswest * 60UL; +#endif +} + /* Return true if the specified path is just a file basename without any * relative or absolute path. This function just checks that no / or \ * character exists inside the specified path, that's enough in the diff --git a/src/util.h b/src/util.h index 91acde04..cc154d96 100644 --- a/src/util.h +++ b/src/util.h @@ -50,6 +50,7 @@ int string2ld(const char *s, size_t slen, long double *dp); int d2string(char *buf, size_t len, double value); int ld2string(char *buf, size_t len, long double value, int humanfriendly); sds getAbsolutePath(char *filename); +unsigned long getTimeZone(void); int pathIsBaseName(char *path); #ifdef REDIS_TEST