]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add support for floats as barewords
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 28 Jan 2022 21:35:10 +0000 (15:35 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 28 Jan 2022 21:38:59 +0000 (15:38 -0600)
src/lib/server/tmpl_tokenize.c

index e964a11f376004b81bdf5a2303a84558f199caf9..03da26a307e91606ac9b90e78662373571faedad 100644 (file)
@@ -2516,7 +2516,7 @@ static ssize_t tmpl_afrom_ether_substr(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t
 static ssize_t tmpl_afrom_integer_substr(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t *in,
                                         fr_sbuff_parse_rules_t const *p_rules)
 {
-       tmpl_t  *vpt;
+       tmpl_t          *vpt;
        fr_sbuff_t      our_in = FR_SBUFF(in);
        ssize_t         slen;
        fr_value_box_t  *vb;
@@ -2589,6 +2589,34 @@ static ssize_t tmpl_afrom_integer_substr(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff
        return fr_sbuff_set(in, &our_in);
 }
 
+static ssize_t tmpl_afrom_float_substr(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t *in,
+                                      fr_sbuff_parse_rules_t const *p_rules)
+{
+       tmpl_t          *vpt;
+       fr_sbuff_t      our_in = FR_SBUFF(in);
+       double          a_float;
+       ssize_t         slen;
+       fr_value_box_t  *vb;
+
+       slen = fr_sbuff_out(NULL, &a_float, &our_in);
+       if (slen <= 0) return 0;
+
+       if (!tmpl_substr_terminal_check(&our_in, p_rules)) {
+               fr_strerror_const("Unexpected text after float");
+               return fr_sbuff_error(&our_in);
+       }
+
+       MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA,
+                            T_BARE_WORD, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)));
+       vb = tmpl_value(vpt);
+       fr_value_box_init(vb, FR_TYPE_FLOAT64, NULL, false);
+       vb->vb_float64 = a_float;
+
+       *out = vpt;
+
+       return fr_sbuff_set(in, &our_in);
+}
+
 /** Convert an arbitrary string into a #tmpl_t
  *
  * @note Unlike #tmpl_afrom_attr_str return code 0 doesn't necessarily indicate failure,
@@ -2726,15 +2754,16 @@ ssize_t tmpl_afrom_substr(TALLOC_CTX *ctx, tmpl_t **out,
                fr_assert(!*out);
 
                /*
-                *      See if it's a float
+                *      See if it's a integer
                 */
-//             slen = tmpl_afrom_float_substr(ctx, out, &our_in);
-//             if (slen > 0) return fr_sbuff_set(in, &our_in);
+               slen = tmpl_afrom_integer_substr(ctx, out, &our_in, p_rules);
+               if (slen > 0) goto done_bareword;
+               fr_assert(!*out);
 
                /*
-                *      See if it's a integer
+                *      See if it's a float
                 */
-               slen = tmpl_afrom_integer_substr(ctx, out, &our_in, p_rules);
+               slen = tmpl_afrom_float_substr(ctx, out, &our_in, p_rules);
                if (slen > 0) goto done_bareword;
                fr_assert(!*out);