]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add "hint" for scaling to delta_from_str
authorAlan T. DeKok <aland@freeradius.org>
Wed, 22 May 2019 15:15:13 +0000 (11:15 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 22 May 2019 15:15:13 +0000 (11:15 -0400)
and allow non-qualified numbers, which use "hint" as the scale

src/lib/server/cf_parse.c
src/lib/util/time.c
src/lib/util/time.h
src/lib/util/value.c

index 3a230336b943ee36376a46d1086b3e275076c9a4..9ce94dfa3fe7e926064444e2618b0ae2872ec892 100644 (file)
@@ -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;
index 78861a1d34e3ade6db65ccfefa52a25ff7573d97..2b687fd41194ee9c58ca4ae67d4fcae803d1f125 100644 (file)
@@ -27,6 +27,7 @@ RCSID("$Id$")
 #include <freeradius-devel/autoconf.h>
 #include <freeradius-devel/util/time.h>
 #include <freeradius-devel/util/dlist.h>
+#include <freeradius-devel/util/dict.h>
 #include <freeradius-devel/util/strerror.h>
 
 /*
@@ -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;
        }
index 512f65ab640cd778185003f2aafd76934e4365ed..29d1d5a8ceea8e1737420077650e53448c10a057 100644 (file)
@@ -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
 }
index 62ef34cb60f71509035956b3762a109377f46506..995f8b1edfb6739a49f68abc87fffb8ada8dc22a 100644 (file)
@@ -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: