The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
|
Parse dictionary files. More...
#include <freeradius-devel/radius/defs.h>
#include <freeradius-devel/util/conf.h>
#include <freeradius-devel/util/dict_fixup_priv.h>
#include <freeradius-devel/util/dict_priv.h>
#include <freeradius-devel/util/dict.h>
#include <freeradius-devel/util/file.h>
#include <freeradius-devel/util/rand.h>
#include <freeradius-devel/util/strerror.h>
#include <freeradius-devel/util/syserror.h>
#include <freeradius-devel/util/table.h>
#include <freeradius-devel/util/types.h>
#include <freeradius-devel/util/value.h>
#include <sys/stat.h>
Go to the source code of this file.
Data Structures | |
struct | dict_tokenize_ctx_s |
struct | dict_tokenize_frame_t |
Parser context for dict_from_file. More... | |
struct | fr_dict_keyword_parser_t |
struct | fr_dict_keyword_t |
Macros | |
#define | ASSERT_CURRENT_NEST(_dctx, _nest) |
#define | CURRENT_DA(_dctx) (CURRENT_FRAME(_dctx)->da) |
#define | CURRENT_FILENAME(_dctx) (CURRENT_FRAME(_dctx)->filename) |
#define | CURRENT_FRAME(_dctx) (&(_dctx)->stack[(_dctx)->stack_depth]) |
#define | CURRENT_LINE(_dctx) (CURRENT_FRAME(_dctx)->line) |
#define | DICT_MAX_ARGV (8) |
Maximum number of arguments. | |
#define | DICT_MAX_STACK (32) |
Maximum stack size. | |
#define | FLAG_FUNC(_name) |
Define a flag setting function, which sets one bit in a fr_dict_attr_flags_t. | |
Typedefs | |
typedef int(* | fr_dict_keyword_parse_t) (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
Keyword parser. | |
typedef int(* | fr_dict_section_begin_t) (dict_tokenize_ctx_t *dctx) |
Pushes a new frame onto the top of the stack based on the current frame. | |
Enumerations | |
enum | dict_nest_t { NEST_NONE = 0x00 , NEST_ROOT = 0x01 , NEST_PROTOCOL = 0x02 , NEST_VENDOR = 0x04 , NEST_ATTRIBUTE = 0x08 } |
This represents explicit BEGIN/END frames pushed onto the stack. More... | |
Functions | |
static int | _dict_from_file (dict_tokenize_ctx_t *dctx, char const *dir_name, char const *filename, char const *src_file, int src_line) |
static int | dict_attr_add_or_fixup (dict_fixup_ctx_t *fixup, fr_dict_attr_t **da_p) |
Add an attribute to the dictionary, or add it to a list of attributes to clone later. | |
static int | dict_attr_allow_dup (fr_dict_attr_t const *da) |
Check if this definition is a duplicate, and if it is, whether we should skip it error out. | |
static void | dict_attr_location_set (dict_tokenize_ctx_t *dctx, fr_dict_attr_t *da) |
static int | dict_begin_protocol (dict_tokenize_ctx_t *dctx) |
Process an inline BEGIN PROTOCOL block. | |
void | dict_dctx_debug (dict_tokenize_ctx_t *dctx) |
static dict_tokenize_frame_t const * | dict_dctx_find_frame (dict_tokenize_ctx_t *dctx, dict_nest_t nest) |
static dict_tokenize_frame_t const * | dict_dctx_pop (dict_tokenize_ctx_t *dctx) |
Pop the current stack frame. | |
static int | dict_dctx_push (dict_tokenize_ctx_t *dctx, fr_dict_attr_t const *da, dict_nest_t nest) |
static int | dict_dctx_push_or_update (dict_tokenize_ctx_t *dctx, fr_dict_attr_t const *da, dict_nest_t nest) |
Either updates the da in the current stack frame if 'nest' matches, or pushes a new frame of type 'nest'. | |
static dict_tokenize_frame_t const * | dict_dctx_unwind (dict_tokenize_ctx_t *dctx) |
Unwind the entire stack, returning the root frame. | |
static dict_tokenize_frame_t const * | dict_dctx_unwind_until (dict_tokenize_ctx_t *dctx, dict_nest_t nest) |
Unwind the stack until it points to a particular type of stack frame. | |
static int | dict_filename_add (char **filename_out, fr_dict_t *dict, char const *filename) |
Maintain a linked list of filenames which we've seen loading this dictionary. | |
static bool | dict_filename_loaded (fr_dict_t *dict, char const *filename) |
See if we have already loaded the file,. | |
static int | dict_finalise (dict_tokenize_ctx_t *dctx) |
static int | dict_flag_clone (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rules) |
static int | dict_flag_enum (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_key (fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_length (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_offset (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_precision (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_ref (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_secret (fr_dict_attr_t **da_p, UNUSED char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_flag_subtype (fr_dict_attr_t **da_p, char const *value, UNUSED fr_dict_flag_parser_rule_t const *rule) |
static int | dict_from_file (fr_dict_t *dict, char const *dir_name, char const *filename, char const *src_file, int src_line) |
static int | dict_process_type_field (dict_tokenize_ctx_t *dctx, char const *name, fr_dict_attr_t **da_p) |
static int | dict_read_parse_format (char const *format, int *ptype, int *plength, bool *pcontinuation) |
static int | dict_read_process_alias (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_attribute (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_begin (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_begin_protocol (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_begin_vendor (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_common (dict_tokenize_ctx_t *dctx, fr_dict_attr_t **da_p, char const *name, char const *type_name, char *flag_name, fr_dict_attr_flags_t const *base_flags) |
static int | dict_read_process_define (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_end (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_end_protocol (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_end_vendor (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_enum (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_flags (UNUSED dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_include (dict_tokenize_ctx_t *dctx, char **argv, int argc, char const *dir) |
static int | dict_read_process_member (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
static int | dict_read_process_protocol (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flag) |
Register the specified dictionary as a protocol dictionary. | |
static int | dict_read_process_struct (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
Process a STRUCT name attr value. | |
static int | dict_read_process_value (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
Process a value alias. | |
static int | dict_read_process_vendor (dict_tokenize_ctx_t *dctx, char **argv, int argc, UNUSED fr_dict_attr_flags_t *base_flags) |
static int | dict_read_sscanf_i (unsigned int *pvalue, char const *str) |
static int | dict_root_set (fr_dict_t *dict, char const *name, unsigned int proto_number) |
Set a new root dictionary attribute. | |
static int | dict_set_value_attr (dict_tokenize_ctx_t *dctx, fr_dict_attr_t *da) |
static int | dict_struct_finalise (dict_tokenize_ctx_t *dctx) |
fr_dict_t * | fr_dict_alloc (char const *proto_name, unsigned int proto_number) |
int | fr_dict_internal_afrom_file (fr_dict_t **out, char const *dict_subdir, char const *dependent) |
(Re-)Initialize the special internal dictionary | |
int | fr_dict_parse_str (fr_dict_t *dict, char *buf, fr_dict_attr_t const *parent) |
int | fr_dict_protocol_afrom_file (fr_dict_t **out, char const *proto_name, char const *proto_dir, char const *dependent) |
(Re)-initialize a protocol dictionary | |
int | fr_dict_read (fr_dict_t *dict, char const *dir, char const *filename) |
Read supplementary attribute definitions into an existing dictionary. | |
int | fr_dict_str_to_argv (char *str, char **argv, int max_argc) |
static | TABLE_TYPE_NAME_FUNC_RPTR (table_sorted_value_by_str, fr_dict_flag_parser_t const *, fr_dict_attr_flag_to_parser, fr_dict_flag_parser_rule_t const *, fr_dict_flag_parser_rule_t const *) |
A lookup function for dictionary attribute flags. | |
static | TABLE_TYPE_NAME_FUNC_RPTR (table_sorted_value_by_str, fr_dict_keyword_t const *, fr_dict_keyword, fr_dict_keyword_parser_t const *, fr_dict_keyword_parser_t const *) |
Variables | |
static fr_table_num_sorted_t const | dict_nest_table [] |
static size_t const | dict_nest_table_len = NUM_ELEMENTS(dict_nest_table) |
Parse dictionary files.
Definition in file dict_tokenize.c.
struct dict_tokenize_ctx_s |
Definition at line 91 of file dict_tokenize.c.
Data Fields | ||
---|---|---|
fr_dict_t * | dict | Protocol dictionary we're inserting attributes into. |
dict_fixup_ctx_t | fixup | |
fr_dict_attr_t const * | relative_attr | for ".82" instead of "1.2.3.82". only for parents of type "tlv" |
dict_tokenize_frame_t | stack[DICT_MAX_STACK] | stack of attributes to track |
int | stack_depth | points to the last used stack frame |
fr_dict_attr_t * | value_attr | Cache of last attribute to speed up value processing. |
struct dict_tokenize_frame_t |
Parser context for dict_from_file.
Allows vendor and TLV context to persist across $INCLUDEs
Definition at line 80 of file dict_tokenize.c.
Data Fields | ||
---|---|---|
fr_dict_attr_t const * | da | the da we care about |
fr_dict_t * | dict | The dictionary before the current BEGIN-PROTOCOL block. |
char * | filename | name of the file we're reading |
int | line | line number of this file |
int | member_num | structure member numbers |
dict_nest_t | nest | for manual vs automatic begin / end things |
fr_dict_attr_t const * | struct_is_closed | no more members are allowed |
ssize_t | struct_size | size of the struct. |
struct fr_dict_keyword_parser_t |
Definition at line 2841 of file dict_tokenize.c.
Data Fields | ||
---|---|---|
fr_dict_section_begin_t | begin | Can have a BEGIN prefix. |
fr_dict_keyword_parse_t | parse | Function to parse the keyword with. |
struct fr_dict_keyword_t |
Definition at line 2846 of file dict_tokenize.c.
Data Fields | ||
---|---|---|
fr_table_elem_name_t | name | Name of the keyword, e.g. "ATTRIBUTE". |
fr_dict_keyword_parser_t | value | Value to return from lookup. |
#define ASSERT_CURRENT_NEST | ( | _dctx, | |
_nest | |||
) |
Definition at line 111 of file dict_tokenize.c.
#define CURRENT_DA | ( | _dctx | ) | (CURRENT_FRAME(_dctx)->da) |
Definition at line 107 of file dict_tokenize.c.
#define CURRENT_FILENAME | ( | _dctx | ) | (CURRENT_FRAME(_dctx)->filename) |
Definition at line 108 of file dict_tokenize.c.
#define CURRENT_FRAME | ( | _dctx | ) | (&(_dctx)->stack[(_dctx)->stack_depth]) |
Definition at line 106 of file dict_tokenize.c.
#define CURRENT_LINE | ( | _dctx | ) | (CURRENT_FRAME(_dctx)->line) |
Definition at line 109 of file dict_tokenize.c.
#define DICT_MAX_ARGV (8) |
Maximum number of arguments.
For any one keyword, this is the maxiumum number of arguments that can be passed.
Definition at line 45 of file dict_tokenize.c.
#define DICT_MAX_STACK (32) |
Maximum stack size.
This is the maximum number of nested BEGIN and $INCLUDE statements.
Definition at line 51 of file dict_tokenize.c.
#define FLAG_FUNC | ( | _name | ) |
Define a flag setting function, which sets one bit in a fr_dict_attr_flags_t.
This is here, because AFAIK there's no completely portable way to get the bit offset of a bit field in a structure.
Definition at line 458 of file dict_tokenize.c.
typedef int(* fr_dict_keyword_parse_t) (dict_tokenize_ctx_t *dctx, char **argv, int argc, fr_dict_attr_flags_t *base_flags) |
Keyword parser.
[in] | dctx | containing the dictionary we're currently parsing. |
[in] | argv | arguments to the keyword. |
[in] | argc | number of arguments. |
[in] | base_flags | set in the context of the current file. |
Definition at line 2821 of file dict_tokenize.c.
typedef int(* fr_dict_section_begin_t) (dict_tokenize_ctx_t *dctx) |
Pushes a new frame onto the top of the stack based on the current frame.
Whenever a protocol, vendor, or attribute is defined in the dictionary it either mutates or pushes a new NONE frame onto the stack. This holds the last defined object at a given level of nesting.
This function is used to push an additional frame onto the stack, effectively entering the context of the last defined object at a given level of nesting
[in] | dctx | Contains the current state of the dictionary parser. Used to track what PROTOCOL, VENDOR or TLV block we're in. |
Definition at line 2839 of file dict_tokenize.c.
enum dict_nest_t |
This represents explicit BEGIN/END frames pushed onto the stack.
These are flags to allow multiple nesting types to be passed to the search function.
Enumerator | |
---|---|
NEST_NONE | |
NEST_ROOT | |
NEST_PROTOCOL | |
NEST_VENDOR | |
NEST_ATTRIBUTE |
Definition at line 58 of file dict_tokenize.c.
|
static |
|
static |
Add an attribute to the dictionary, or add it to a list of attributes to clone later.
[in] | fixup | context to add an entry to (if needed). |
[in] | da_p | to either add, or create a fixup for. |
Definition at line 819 of file dict_tokenize.c.
|
static |
Check if this definition is a duplicate, and if it is, whether we should skip it error out.
Definition at line 886 of file dict_tokenize.c.
|
inlinestatic |
|
static |
Process an inline BEGIN PROTOCOL block.
Definition at line 2794 of file dict_tokenize.c.
void dict_dctx_debug | ( | dict_tokenize_ctx_t * | dctx | ) |
|
static |
|
static |
Pop the current stack frame.
[in] | dctx | Stack to pop from. @preturn
|
Definition at line 188 of file dict_tokenize.c.
|
static |
|
static |
Either updates the da in the current stack frame if 'nest' matches, or pushes a new frame of type 'nest'.
[in] | dctx | Stack to push to. |
[in] | da | Attribute to push. |
[in] | nest | Frame type to push. |
Definition at line 169 of file dict_tokenize.c.
|
static |
Unwind the entire stack, returning the root frame.
[in] | dctx | Stack to unwind. |
Definition at line 200 of file dict_tokenize.c.
|
static |
Unwind the stack until it points to a particular type of stack frame.
[in] | dctx | Stack to unwind. |
[in] | nest | Frame type to unwind to. |
Definition at line 218 of file dict_tokenize.c.
|
inlinestatic |
Maintain a linked list of filenames which we've seen loading this dictionary.
This is used for debug messages, so we have a copy of the original file path that we can reference from fr_dict_attr_t without having the memory bloat of assigning a buffer to every attribute.
Definition at line 2718 of file dict_tokenize.c.
See if we have already loaded the file,.
Definition at line 2740 of file dict_tokenize.c.
|
static |
Definition at line 793 of file dict_tokenize.c.
|
static |
Definition at line 467 of file dict_tokenize.c.
|
static |
Definition at line 485 of file dict_tokenize.c.
|
static |
|
static |
|
static |
|
static |
Definition at line 573 of file dict_tokenize.c.
|
static |
Definition at line 598 of file dict_tokenize.c.
|
static |
|
static |
Definition at line 632 of file dict_tokenize.c.
|
static |
Definition at line 3132 of file dict_tokenize.c.
|
static |
Definition at line 339 of file dict_tokenize.c.
|
static |
Definition at line 1074 of file dict_tokenize.c.
|
static |
Definition at line 1145 of file dict_tokenize.c.
|
static |
Definition at line 1198 of file dict_tokenize.c.
|
static |
Definition at line 1370 of file dict_tokenize.c.
|
static |
Definition at line 1423 of file dict_tokenize.c.
|
static |
Definition at line 1481 of file dict_tokenize.c.
|
static |
Definition at line 953 of file dict_tokenize.c.
|
static |
Definition at line 1623 of file dict_tokenize.c.
|
static |
Definition at line 1738 of file dict_tokenize.c.
|
static |
Definition at line 1794 of file dict_tokenize.c.
|
static |
Definition at line 1860 of file dict_tokenize.c.
|
static |
Definition at line 1912 of file dict_tokenize.c.
|
static |
|
static |
Definition at line 1007 of file dict_tokenize.c.
|
static |
Definition at line 2042 of file dict_tokenize.c.
|
static |
Register the specified dictionary as a protocol dictionary.
Allows vendor and TLV context to persist across $INCLUDEs
Definition at line 2562 of file dict_tokenize.c.
|
static |
Process a STRUCT name attr value.
Define struct 'name' when key 'attr' has 'value'.
Which MUST be a sub-structure of another struct
Definition at line 2248 of file dict_tokenize.c.
|
static |
Process a value alias.
Definition at line 2412 of file dict_tokenize.c.
|
static |
Definition at line 2506 of file dict_tokenize.c.
|
static |
|
static |
Set a new root dictionary attribute.
[in] | dict | to modify. |
[in] | name | of dictionary root. |
[in] | proto_number | The artificial (or IANA allocated) number for the protocol. This is only used for |
Definition at line 314 of file dict_tokenize.c.
|
static |
Definition at line 935 of file dict_tokenize.c.
|
static |
Definition at line 2754 of file dict_tokenize.c.
fr_dict_t * fr_dict_alloc | ( | char const * | proto_name, |
unsigned int | proto_number | ||
) |
Definition at line 3423 of file dict_tokenize.c.
int fr_dict_internal_afrom_file | ( | fr_dict_t ** | out, |
char const * | dict_subdir, | ||
char const * | dependent | ||
) |
(Re-)Initialize the special internal dictionary
This dictionary has additional programmatically generated attributes added to it, and is checked in addition to the protocol specific dictionaries.
[out] | out | Where to write pointer to the internal dictionary. |
[in] | dict_subdir | name of the internal dictionary dir (may be NULL). |
[in] | dependent | Either C src file, or another dictionary. |
Definition at line 3177 of file dict_tokenize.c.
int fr_dict_parse_str | ( | fr_dict_t * | dict, |
char * | buf, | ||
fr_dict_attr_t const * | parent | ||
) |
Definition at line 3478 of file dict_tokenize.c.
int fr_dict_protocol_afrom_file | ( | fr_dict_t ** | out, |
char const * | proto_name, | ||
char const * | proto_dir, | ||
char const * | dependent | ||
) |
(Re)-initialize a protocol dictionary
Initialize the directory, then fix the attr number of all attributes.
[out] | out | Where to write a pointer to the new dictionary. Will free existing dictionary if files have changed and *out is not NULL. |
[in] | proto_name | that we're loading the dictionary for. |
[in] | proto_dir | Explicitly set where to hunt for the dictionary files. May be NULL. |
[in] | dependent | Either C src file, or another dictionary. |
Definition at line 3314 of file dict_tokenize.c.
int fr_dict_read | ( | fr_dict_t * | dict, |
char const * | dir, | ||
char const * | filename | ||
) |
Read supplementary attribute definitions into an existing dictionary.
[in] | dict | Existing dictionary. |
[in] | dir | dictionary is located in. |
[in] | filename | of the dictionary. |
Definition at line 3458 of file dict_tokenize.c.
int fr_dict_str_to_argv | ( | char * | str, |
char ** | argv, | ||
int | max_argc | ||
) |
|
static |
A lookup function for dictionary attribute flags.
Definition at line 697 of file dict_tokenize.c.
|
static |
|
static |
Definition at line 67 of file dict_tokenize.c.
|
static |
Definition at line 74 of file dict_tokenize.c.