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) {