{
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;
#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>
/*
* - 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;
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;
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;
}
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
}
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: