From: Alan T. DeKok Date: Wed, 22 May 2019 15:15:13 +0000 (-0400) Subject: add "hint" for scaling to delta_from_str X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2ec816951c8bb8ed97c1d0d3086ae9db3cfaad7;p=thirdparty%2Ffreeradius-server.git add "hint" for scaling to delta_from_str and allow non-qualified numbers, which use "hint" as the scale --- diff --git a/src/lib/server/cf_parse.c b/src/lib/server/cf_parse.c index 3a230336b94..9ce94dfa3fe 100644 --- a/src/lib/server/cf_parse.c +++ b/src/lib/server/cf_parse.c @@ -407,7 +407,7 @@ int cf_pair_parse_value(TALLOC_CTX *ctx, void *out, UNUSED void *base, CONF_ITEM { fr_time_delta_t delta; - if (fr_time_delta_from_str(&delta, cp->value) < 0) { + if (fr_time_delta_from_str(&delta, cp->value, DATE_SECONDS) < 0) { cf_log_perr(cp, "Failed parsing config item"); rcode = -1; goto error; diff --git a/src/lib/util/time.c b/src/lib/util/time.c index 78861a1d34e..2b687fd4119 100644 --- a/src/lib/util/time.c +++ b/src/lib/util/time.c @@ -27,6 +27,7 @@ RCSID("$Id$") #include #include #include +#include #include /* @@ -421,7 +422,7 @@ void fr_time_elapsed_fprint(FILE *fp, fr_time_elapsed_t const *elapsed, char con * - 0 on success. * - -1 on failure. */ -int fr_time_delta_from_str(fr_time_delta_t *out, char const *in) +int fr_time_delta_from_str(fr_time_delta_t *out, char const *in, int hint) { int sec; char *p, *end; @@ -487,9 +488,9 @@ int fr_time_delta_from_str(fr_time_delta_t *out, char const *in) parse_precision: /* - * Nothing else, it defaults to "s". + * Nothing else, it defaults to whatever scale the caller passed. */ - if (!*p) goto done; + if (!*p) goto do_scale; if ((p[0] == 's') && !p[1]) goto done; @@ -571,6 +572,29 @@ int fr_time_delta_from_str(fr_time_delta_t *out, char const *in) delta = minutes * 60 + sec; + } else if (!*end) { + do_scale: + switch (hint) { + case DATE_SECONDS: + break; + + case DATE_MILLISECONDS: + delta /= 1000; + break; + + case DATE_MICROSECONDS: + delta /= 1000000; + break; + + case DATE_NANOSECONDS: + delta /= 1000000000; + break; + + default: + fr_strerror_printf("Invalid hint %d for time delta", hint); + return -1; + } + } else { goto failed; } diff --git a/src/lib/util/time.h b/src/lib/util/time.h index 512f65ab640..29d1d5a8cee 100644 --- a/src/lib/util/time.h +++ b/src/lib/util/time.h @@ -170,7 +170,7 @@ void fr_time_tracking_debug(fr_time_tracking_t *tt, FILE *fp) CC_HINT(nonnull); void fr_time_elapsed_update(fr_time_elapsed_t *elapsed, fr_time_t start, fr_time_t end); void fr_time_elapsed_fprint(FILE *fp, fr_time_elapsed_t const *elapsed, char const *prefix, int tabs); -int fr_time_delta_from_str(fr_time_delta_t *out, char const *in); +int fr_time_delta_from_str(fr_time_delta_t *out, char const *in, int hint); #ifdef __cplusplus } diff --git a/src/lib/util/value.c b/src/lib/util/value.c index 62ef34cb60f..995f8b1edfb 100644 --- a/src/lib/util/value.c +++ b/src/lib/util/value.c @@ -3854,7 +3854,7 @@ parse: break; case FR_TYPE_TIME_DELTA: - if (fr_time_delta_from_str(&dst->datum.time_delta, in) < 0) return -1; + if (fr_time_delta_from_str(&dst->datum.time_delta, in, DATE_SECONDS) < 0) return -1; break; case FR_TYPE_FLOAT32: