[FR_TYPE_VENDOR] = true
};
+static FR_NAME_NUMBER const date_precision_table[] = {
+ { "seconds", DATE_SECONDS },
+ { "milliseconds", DATE_MILLISECONDS },
+ { "microseconds", DATE_MICROSECONDS },
+ { "nanoseconds", DATE_NANOSECONDS },
+
+ { NULL, 0 }
+};
+
/*
* Create the hash of the name.
*
fr_int2str(fr_value_box_type_table, type, "?Unknown?"));
return false;
+ case FR_TYPE_DATE:
+ if (flags->type_size > DATE_NANOSECONDS) {
+ fr_strerror_printf("Invalid precision '%d' for attribute of type 'date'",
+ flags->type_size);
+ return false;
+ }
+ break;
+
+
default:
break;
}
}
-static int dict_process_flag_field(dict_from_file_ctx_t *ctx, char *name, fr_dict_attr_t const **ref_p, fr_dict_attr_flags_t *flags)
+static int dict_process_flag_field(dict_from_file_ctx_t *ctx, char *name, fr_type_t type, fr_dict_attr_t const **ref_p, fr_dict_attr_flags_t *flags)
{
char *p, *q, *v;
fr_dict_attr_t const *ref = NULL;
*ref_p = ref;
+ } else if (type == FR_TYPE_DATE) {
+ int precision;
+
+ precision = fr_str2int(date_precision_table, key, -1);
+ if (precision < 0) {
+ fr_strerror_printf("Unknown date precision '%s'", key);
+ return -1;
+ }
+ flags->type_size = precision;
+
} else {
fr_strerror_printf("Unknown option '%s'", key);
return -1;
/*
* Parse options.
*/
- if ((argc >= 4) && (dict_process_flag_field(ctx, argv[3], &ref, &flags) < 0)) return -1;
+ if ((argc >= 4) && (dict_process_flag_field(ctx, argv[3], type, &ref, &flags) < 0)) return -1;
#ifdef WITH_DICTIONARY_WARNINGS
/*
/*
* Parse options.
*/
- if ((argc >= 3) && (dict_process_flag_field(ctx, argv[2], NULL, &flags) < 0)) return -1;
+ if ((argc >= 3) && (dict_process_flag_field(ctx, argv[2], type, NULL, &flags) < 0)) return -1;
#ifdef __clang_analyzer__
if (!ctx->dict) return -1;