summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Martí <vicent@github.com>2012-08-28 13:55:55 -0700
committerVicent Martí <vicent@github.com>2012-08-28 13:55:55 -0700
commit319ad0ba208ec67523a808269b8662c88727a0c9 (patch)
treec0ffff4214ddaac0b3d76ccf08c090c4b2052678
parent0844ed069e3a09fd2438b5704ee1519182634520 (diff)
parentd03d309b1082af7002e82c4b7028b23836d7e905 (diff)
downloadlibgit2-319ad0ba208ec67523a808269b8662c88727a0c9.tar.gz
Merge pull request #905 from carlosmn/signature-now
signature: make the OS give us the offset for git_signature_now
-rw-r--r--src/signature.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/signature.c b/src/signature.c
index 1f788356..84c3f499 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -125,24 +125,26 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
{
time_t now;
time_t offset;
- struct tm *utc_tm, *local_tm;
+ struct tm *utc_tm;
git_signature *sig;
- struct tm _utc, _local;
+ struct tm _utc;
*sig_out = NULL;
+ /*
+ * Get the current time as seconds since the epoch and
+ * transform that into a tm struct containing the time at
+ * UTC. Give that to mktime which considers it a local time
+ * (tm_isdst = -1 asks it to take DST into account) and gives
+ * us that time as seconds since the epoch. The difference
+ * between its return value and 'now' is our offset to UTC.
+ */
time(&now);
-
utc_tm = p_gmtime_r(&now, &_utc);
- local_tm = p_localtime_r(&now, &_local);
-
- offset = mktime(local_tm) - mktime(utc_tm);
+ utc_tm->tm_isdst = -1;
+ offset = difftime(now, mktime(utc_tm));
offset /= 60;
- /* mktime takes care of setting tm_isdst correctly */
- if (local_tm->tm_isdst)
- offset += 60;
-
if (git_signature_new(&sig, name, email, now, (int)offset) < 0)
return -1;