Commit 14eb94eefa8b3d84ca4db006f7ae4f2347cd2238

Vicent Marti 2011-04-09T16:06:17

Fix `gmtime` issues in Win32

diff --git a/src/signature.c b/src/signature.c
index c5b175c..15753a7 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -68,18 +68,32 @@ git_signature *git_signature_dup(const git_signature *sig)
 git_signature *git_signature_now(const char *name, const char *email)
 {
 	time_t now;
-	struct tm utc_tm, local_tm;
 	int offset;
+	struct tm *utc_tm, *local_tm;
 
-	time(&now);
+#ifndef GIT_WIN32
+	struct tm _utc, _local;
+#endif
 
-	gmtime_r(&now, &utc_tm);
-	localtime_r(&now, &local_tm);
+	time(&now);
 
-	offset = mktime(&local_tm) - mktime(&utc_tm);
+	/**
+	 * On Win32, `gmtime_r` doesn't exist but
+	 * `gmtime` is threadsafe, so we can use that
+	 */
+#ifdef GIT_WIN32
+	utc_tm = gmtime(&now);
+	local_tm = localtime(&now);
+#else
+	utc_tm = gmtime_r(&now, &_utc);
+	local_tm = localtime_r(&now, &_local);
+#endif
+
+	offset = mktime(local_tm) - mktime(utc_tm);
 	offset /= 60;
+
 	/* mktime takes care of setting tm_isdst correctly */
-	if (local_tm.tm_isdst)
+	if (local_tm->tm_isdst)
 		offset += 60;
 
 	return git_signature_new(name, email, now, offset);