Commit d03d309b by Carlos Martín Nieto

signature: make the OS give us the offset for git_signature_now

There is a better and less fragile way to calculate time offsets. Let
the OS take care of dealing with DST and simply take the the offset
between the local time and UTC that it gives us.
parent 0d5dce26
...@@ -125,24 +125,26 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema ...@@ -125,24 +125,26 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
{ {
time_t now; time_t now;
time_t offset; time_t offset;
struct tm *utc_tm, *local_tm; struct tm *utc_tm;
git_signature *sig; git_signature *sig;
struct tm _utc, _local; struct tm _utc;
*sig_out = NULL; *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); time(&now);
utc_tm = p_gmtime_r(&now, &_utc); utc_tm = p_gmtime_r(&now, &_utc);
local_tm = p_localtime_r(&now, &_local); utc_tm->tm_isdst = -1;
offset = difftime(now, mktime(utc_tm));
offset = mktime(local_tm) - mktime(utc_tm);
offset /= 60; 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) if (git_signature_new(&sig, name, email, now, (int)offset) < 0)
return -1; return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment