diff --git a/src/common/util.c b/src/common/util.c index ccc130030e410380b5382f457cb95f7aaa1ec602..098b201573cec4c360fffa478beaa127c18bc019 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -112,13 +112,29 @@ void tv_addms(struct timeval *a, long ms) { a->tv_usec %= 1000000; } +time_t tor_timegm (struct tm *tm) { + time_t ret; + char *tz; + + tz = getenv("TZ"); + setenv("TZ", "", 1); + tzset(); + ret = mktime(tm); + if (tz) + setenv("TZ", tz, 1); + else + unsetenv("TZ"); + tzset(); + return ret; +} + /* * Low-level I/O. */ /* a wrapper for write(2) that makes sure to write all count bytes. * Only use if fd is a blocking fd. */ -int write_all(int fd, const void *buf, size_t count) { +int write_all(int fd, const char *buf, size_t count) { int written = 0; int result; @@ -133,7 +149,7 @@ int write_all(int fd, const void *buf, size_t count) { /* a wrapper for read(2) that makes sure to read all count bytes. * Only use if fd is a blocking fd. */ -int read_all(int fd, void *buf, size_t count) { +int read_all(int fd, char *buf, size_t count) { int numread = 0; int result; diff --git a/src/common/util.h b/src/common/util.h index 6358654bffad6b0e8a43b6bccfec2145353b3fa2..01087df87d8e3842564908411da584a38793abbf 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -44,8 +44,10 @@ void tv_addms(struct timeval *a, long ms); void tv_add(struct timeval *a, struct timeval *b); int tv_cmp(struct timeval *a, struct timeval *b); -int write_all(int fd, const void *buf, size_t count); -int read_all(int fd, void *buf, size_t count); +time_t tor_timegm (struct tm *tm); + +int write_all(int fd, const char *buf, size_t count); +int read_all(int fd, char *buf, size_t count); void set_socket_nonblocking(int socket); diff --git a/src/or/routers.c b/src/or/routers.c index 4ecd2fcb9c543e8e787bef39bbbc0078decb7d76..5acaa43005445243e6956ff4ed966034bd067c94 100644 --- a/src/or/routers.c +++ b/src/or/routers.c @@ -599,7 +599,7 @@ int router_get_dir_from_string_impl(char *s, directory_t **dest, if (!strptime(tok.val.cmd.args[0], "%Y-%m-%d %H:%M:%S", &published)) { log_fn(LOG_WARN, "Published time was unparseable"); goto err; } - published_on = timegm(&published); + published_on = tor_timegm(&published); NEXT_TOK(); TOK_IS(K_RECOMMENDED_SOFTWARE, "recommended-software"); @@ -857,7 +857,7 @@ routerinfo_t *router_get_entry_from_string(char**s) { if (!strptime(ARGS[0], "%Y-%m-%d %H:%M:%S", &published)) { log_fn(LOG_WARN, "Published time was unparseable"); goto err; } - router->published_on = timegm(&published); + router->published_on = tor_timegm(&published); NEXT_TOKEN(); if (tok->tp != K_ONION_KEY) {