From: Alan T. DeKok Date: Wed, 25 Aug 2021 21:17:26 +0000 (-0400) Subject: it's now fr_unix_time_from_tm() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5e88e3a7d8e72ab2a2afb43f95efdb2969c6688f;p=thirdparty%2Ffreeradius-server.git it's now fr_unix_time_from_tm() all of the uses of it either set the time zone, or used mktime() and then called fr_unix_time_from_timeval(). So to simplify things, we just use fr_unix_time_from_tm() --- diff --git a/src/lib/util/misc.c b/src/lib/util/misc.c index f075372015d..9b506782909 100644 --- a/src/lib/util/misc.c +++ b/src/lib/util/misc.c @@ -699,25 +699,24 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str, fr_time_re } /* - * We set this, but the timegm() function ignores - * it. Note also that mktime() ignores it too, - * and treats the time zone as local. + * We set the time zone, but the timegm() + * function ignores it. Note also that mktime() + * ignores it too, and treats the time zone as + * local. * * We can't store this value in s_tm.gtmoff, * because the timegm() function helpfully zeros * it out. + * + * So insyead of using stupid C library + * functions, we just roll our own. */ tz = tz_hour * 3600 + tz_min; if (*tail == '-') tz *= -1; done: - *date = fr_unix_time_from_utc(tm); - - /* - * Add in the time zone offset, which the posix - * functions are too stupid to do. - */ - *date += fr_unix_time_from_sec(tz); + tm->tm_gmtoff = tz; + *date = fr_unix_time_from_tm(tm); *date += subseconds; return 0; @@ -752,8 +751,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str, fr_time_re p = strptime(my_str, "%b %e %Y %H:%M:%S %Z", tm); if (p && (*p == '\0')) { talloc_free(my_str); - t = mktime(tm); - *date = fr_unix_time_from_timeval(&(struct timeval) { .tv_sec = t }); + *date = fr_unix_time_from_tm(tm); return 0; } talloc_free(my_str); @@ -764,8 +762,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str, fr_time_re p = strptime(date_str, "%b %e %Y %H:%M:%S %Z", tm); if (p && (*p == '\0')) { - t = mktime(tm); - *date = fr_unix_time_from_timeval(&(struct timeval) { .tv_sec = t }); + *date = fr_unix_time_from_tm(tm); return 0; } @@ -895,13 +892,7 @@ int fr_unix_time_from_str(fr_unix_time_t *date, char const *date_str, fr_time_re tm->tm_min = atoi(f[1]); } - *date = fr_unix_time_from_utc(tm); - - /* - * Add in the time zone offset, which the posix - * functions are too stupid to do. - */ - *date += gmtoff; + *date = fr_unix_time_from_tm(tm) + gmtoff; return 0; } diff --git a/src/lib/util/time.c b/src/lib/util/time.c index 6223262b123..dbb214fd135 100644 --- a/src/lib/util/time.c +++ b/src/lib/util/time.c @@ -539,7 +539,7 @@ void fr_time_elapsed_fprint(FILE *fp, fr_time_elapsed_t const *elapsed, char con /* * Based on https://blog.reverberate.org/2020/05/12/optimizing-date-algorithms.html */ -fr_unix_time_t fr_unix_time_from_utc(struct tm *tm) +fr_unix_time_t fr_unix_time_from_tm(struct tm *tm) { static const uint16_t month_yday[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; @@ -553,5 +553,5 @@ fr_unix_time_t fr_unix_time_from_utc(struct tm *tm) * 2472692 adjusts the days for Unix epoch. It is calculated as * (365.2425 * (4800 + 1970)) */ - return fr_unix_time_from_sec((days - 2472692) * 86400 + (tm->tm_hour * 3600) + (tm->tm_min * 60) + tm->tm_sec); + return fr_unix_time_from_sec((days - 2472692) * 86400 + (tm->tm_hour * 3600) + (tm->tm_min * 60) + tm->tm_sec + tm->tm_gmtoff); } diff --git a/src/lib/util/time.h b/src/lib/util/time.h index 2fed708d680..d4491f5a74c 100644 --- a/src/lib/util/time.h +++ b/src/lib/util/time.h @@ -371,7 +371,7 @@ size_t fr_time_strftime_utc(fr_sbuff_t *out, fr_time_t time, char const *fmt) void fr_time_elapsed_update(fr_time_elapsed_t *elapsed, fr_time_t start, fr_time_t end) CC_HINT(nonnull); void fr_time_elapsed_fprint(FILE *fp, fr_time_elapsed_t const *elapsed, char const *prefix, int tabs) CC_HINT(nonnull(1,2)); -fr_unix_time_t fr_unix_time_from_utc(struct tm *tm) CC_HINT(nonnull); +fr_unix_time_t fr_unix_time_from_tm(struct tm *tm) CC_HINT(nonnull); #ifdef __cplusplus }