Fix `gmtime` issues in Win32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
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);