[core] move timegm() impl inline in sys-time.h

(for systems without timegm())
This commit is contained in:
Glenn Strauss 2021-04-26 12:50:20 -04:00
parent c2feb3e1ad
commit 6b6252a3ba
4 changed files with 30 additions and 31 deletions

View File

@ -276,27 +276,6 @@ http_date_time_to_str (char * const s, const size_t sz, const time_t t)
}
#if !defined(HAVE_TIMEGM) && !defined(_WIN32)
time_t
http_date_timegm (const struct tm * const tm)
{
int y = tm->tm_year + 1900;
int m = tm->tm_mon + 1;
int d = tm->tm_mday;
/* days_from_civil() http://howardhinnant.github.io/date_algorithms.html */
y -= m <= 2;
int era = y / 400;
int yoe = y - era * 400; // [0, 399]
int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; // [0, 365]
int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; // [0, 146096]
int days_since_1970 = era * 146097 + doe - 719468;
return 60*(60*(24L*days_since_1970+tm->tm_hour)+tm->tm_min)+tm->tm_sec;
}
#endif
int
http_date_if_modified_since (const char * const ifmod, const uint32_t ifmodlen,
const time_t lmtime)
@ -304,7 +283,7 @@ http_date_if_modified_since (const char * const ifmod, const uint32_t ifmodlen,
struct tm ifmodtm;
if (NULL == http_date_str_to_tm(ifmod, ifmodlen, &ifmodtm))
return 1; /* date parse error */
const time_t ifmtime = http_date_timegm(&ifmodtm);
const time_t ifmtime = timegm(&ifmodtm);
return (lmtime > ifmtime);
/* returns 0 if not modified since,
* returns 1 if modified since or date parse error */

View File

@ -22,14 +22,6 @@ uint32_t http_date_time_to_str (char *s, size_t sz, time_t t);
int http_date_if_modified_since (const char *ifmod, uint32_t ifmodlen, time_t lmtime);
#ifdef HAVE_TIMEGM
#define http_date_timegm(tm) timegm(tm)
#elif defined(_WIN32)
#define http_date_timegm(tm) _mkgmtime(tm)
#else
time_t http_date_timegm (const struct tm *tm);
#endif
#ifdef __cplusplus
}

View File

@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include "sys-time.h"
#include <errno.h>
#include <fcntl.h>
#include <stdint.h>
@ -1471,7 +1472,7 @@ mod_openssl_asn1_time_to_posix (ASN1_TIME *asn1time)
x.tm_year-= 1900;
x.tm_mon -= 1;
time_t t = http_date_timegm(&x);
time_t t = timegm(&x);
return (t != (time_t)-1) ? t + offset : t;
#else

View File

@ -28,4 +28,31 @@
#define gmtime_r(timep,result) ((*(result) = *(gmtime(timep))), (result))
#endif
#ifndef HAVE_TIMEGM
#ifdef _WIN32
#define timegm(tm) _mkgmtime(tm)
#else
__attribute_pure__
static inline time_t
timegm (const struct tm * const tm);
static inline time_t
timegm (const struct tm * const tm)
{
int y = tm->tm_year + 1900;
int m = tm->tm_mon + 1;
int d = tm->tm_mday;
/* days_from_civil() http://howardhinnant.github.io/date_algorithms.html */
y -= m <= 2;
int era = y / 400;
int yoe = y - era * 400; // [0, 399]
int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; // [0, 365]
int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; // [0, 146096]
int days_since_1970 = era * 146097 + doe - 719468;
return 60*(60*(24L*days_since_1970+tm->tm_hour)+tm->tm_min)+tm->tm_sec;
}
#endif
#endif
#endif