summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/signature.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/signature.c b/src/signature.c
index c5b175cf3..15753a7e6 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);