The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
pair_legacy.c File Reference

AVP manipulation and search API. More...

#include <freeradius-devel/util/dict.h>
#include <freeradius-devel/util/pair.h>
#include <freeradius-devel/util/pair_legacy.h>
#include <freeradius-devel/util/proto.h>
#include <freeradius-devel/util/regex.h>
#include <freeradius-devel/protocol/radius/rfc2865.h>
#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
+ Include dependency graph for pair_legacy.c:

Go to the source code of this file.

Data Structures

struct  legacy_da_stack_t
 Our version of a DA stack. More...
 

Macros

#define CLEAN_DA_STACK
 

Functions

int fr_pair_list_afrom_file (TALLOC_CTX *ctx, fr_dict_t const *dict, fr_pair_list_t *out, FILE *fp, bool *pfiledone)
 Read valuepairs from the fp up to End-Of-File.
 
fr_slen_t fr_pair_list_afrom_substr (fr_pair_parse_t const *root, fr_pair_parse_t *relative, fr_sbuff_t *in)
 Parse a fr_pair_list_t from a substring.
 
void fr_pair_list_move_op (fr_pair_list_t *to, fr_pair_list_t *from, fr_token_t op)
 Move pairs from source list to destination list respecting operator.
 
static ssize_t fr_pair_value_from_substr (fr_pair_t *vp, fr_sbuff_t *in, UNUSED bool tainted)
 

Variables

static fr_sbuff_term_t const bareword_terminals
 
static fr_sbuff_parse_rules_t const bareword_unquoted
 
static fr_table_num_sorted_t const pair_assignment_op_table []
 
static ssize_t pair_assignment_op_table_len = NUM_ELEMENTS(pair_assignment_op_table)
 
static fr_table_num_sorted_t const pair_comparison_op_table []
 
static size_t pair_comparison_op_table_len = NUM_ELEMENTS(pair_comparison_op_table)
 

Detailed Description

AVP manipulation and search API.

Definition in file pair_legacy.c.


Data Structure Documentation

◆ legacy_da_stack_t

struct legacy_da_stack_t

Our version of a DA stack.

@todo - add in whether or not we added / created the vp?  maybe an edit list?
and then we can clean up the unknown DAs, simply by talloc freeing the edit list.

Definition at line 148 of file pair_legacy.c.

+ Collaboration diagram for legacy_da_stack_t:
Data Fields
fr_dict_attr_t const * da[FR_DICT_MAX_TLV_STACK] parent for parsing
int depth
fr_pair_t * vp[FR_DICT_MAX_TLV_STACK] which VP we have created or found

Macro Definition Documentation

◆ CLEAN_DA_STACK

#define CLEAN_DA_STACK
Value:
do { if (was_unknown) { \
for (i = 1; i < da_stack.depth; i++) { \
fr_dict_attr_unknown_free(&da_stack.da[i]); \
} } } while (0)

Function Documentation

◆ fr_pair_list_afrom_file()

int fr_pair_list_afrom_file ( TALLOC_CTX *  ctx,
fr_dict_t const *  dict,
fr_pair_list_t out,
FILE *  fp,
bool pfiledone 
)

Read valuepairs from the fp up to End-Of-File.

Parameters
[in]ctxfor talloc
[in]dictto resolve attributes in.
[in,out]outwhere the parsed fr_pair_ts will be appended.
[in]fpto read valuepairs from.
[out]pfiledonetrue if file parsing complete;
Returns
  • 0 on success
  • -1 on error

Definition at line 1148 of file pair_legacy.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_pair_list_afrom_substr()

fr_slen_t fr_pair_list_afrom_substr ( fr_pair_parse_t const *  root,
fr_pair_parse_t relative,
fr_sbuff_t in 
)

Parse a fr_pair_list_t from a substring.

Syntax: ([raw.]|.)<name>[<.name>] op [(cast)] value...

A "raw" prefix creates a raw attribute, which allows us to encode raw data which might be invalid for the given data type. Or if a "(cast)" is given, the value is parsed as the specified data type. Note that casts can only be to a "leaf" data type, and not to a structural type such as "tlv", "group", "struct", etc. The "(cast)" syntax can only be used for "raw" attributes, and not for attributes which are known. The "name" can be either a known attribute, or a numerical OID. Either way, the final attribute which is created is marked as "raw" or "unknown", and is encoded via the "raw" rules, and not as the known data type.

If the first name begins with ".", then it is a relative name. The attribute is created in the context of the most recently created "structural" data type.

TBD - we have to determine what the heck that means...

The "name" can be one or more names from the input dictionary. The names must be known, as numerical OIDs can only be used when the "raw" prefix is used.

If there are multiple names (e.g. "foo.bar.baz"), then only the last name can be a "leaf" data type. All of the intermediate names must be "structural" data types.

Depending on the input arguments, the operator can be a comparison operator (==, <=, etc.). Or, else it can be an assignment operator (=, +=). The "=" operator is used to assign, and the "+=" operator is used to append. No other assignment operators are permitted. Note that "+=" cannot be used with relative names (i.e. where the name begins with ".")

The "value" can either be a "leaf" data type (e.g. number, IP address, etc.) or for "structural" data types it can be a sub-list. A sub-list is a set of attribute assignments which are surrounded by curly brackets "{...}". When a sub-list is specified, the contents must be either children of the parent attribute (for "tlv", "struct"), or children referenced by a "group", or internal attributes.

If an intermediate "name" is an ALIAS, then the attributes are created / used as if all intermediate names were specified. i.e. ALIAS is a short-cut for names (think "soft link), but it does not change the hierarchy for normal attributes. @iverbatim Examples -------- Name = value Leaf attributes. The value MUST be parsed as the leaf data type. Name = { children } Structural attributes. The children MUST be children of the parent. OR the children can be from the "internal" dictionary. OR for type 'group', children of the group reference (usually the dictionary root)

raw.Name = 0xabcdef Raw attributes. The value MUST be a hex string.

raw.Name = { children }

Parameters
[in]rootwhere we start parsing from
[in,out]relativewhere we left off, or where we should continue from
[in]ininput sbuff
Returns
  • <0 on error
  • 0 on no input
  • >0 on how many bytes of input we read

Definition at line 219 of file pair_legacy.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_pair_list_move_op()

void fr_pair_list_move_op ( fr_pair_list_t to,
fr_pair_list_t from,
fr_token_t  op 
)

Move pairs from source list to destination list respecting operator.

Note
This function does some additional magic that's probably not needed in most places. Consider using radius_legacy_map_cmp() and radius_legacy_map_apply() instead.
fr_pair_list_free should be called on the head of the source list to free unmoved attributes (if they're no longer needed).
Parameters
[in,out]todestination list.
[in,out]fromsource list.
[in]opoperator for list move.

Definition at line 1233 of file pair_legacy.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fr_pair_value_from_substr()

static ssize_t fr_pair_value_from_substr ( fr_pair_t vp,
fr_sbuff_t in,
UNUSED bool  tainted 
)
static

Definition at line 101 of file pair_legacy.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ bareword_terminals

fr_sbuff_term_t const bareword_terminals
static
Initial value:
=
L("\t"),
L("\n"),
L(" "),
L("!*"),
L("!="),
L("!~"),
L("&&"),
L(")"),
L("+="),
L("-="),
L(":="),
L("<"),
L("<="),
L("=*"),
L("=="),
L("=~"),
L(">"),
L(">="),
L("||"),
)
#define L(_str)
Helper for initialising arrays of string literals.
Definition build.h:209
#define FR_SBUFF_TERMS(...)
Initialise a terminal structure with a list of sorted strings.
Definition sbuff.h:193

Definition at line 35 of file pair_legacy.c.

◆ bareword_unquoted

fr_sbuff_parse_rules_t const bareword_unquoted
static
Initial value:
= {
.terminals = &FR_SBUFF_TERMS(
L(""),
L("\t"),
L("\n"),
L("\r"),
L(" "),
L(","),
L("}")
)
}

Definition at line 88 of file pair_legacy.c.

◆ pair_assignment_op_table

fr_table_num_sorted_t const pair_assignment_op_table[]
static
Initial value:
= {
{ L("+="), T_OP_ADD_EQ },
{ L(":="), T_OP_SET },
{ L("="), T_OP_EQ },
}
@ T_OP_EQ
Definition token.h:83
@ T_OP_SET
Definition token.h:84
@ T_OP_ADD_EQ
Definition token.h:69

Definition at line 58 of file pair_legacy.c.

◆ pair_assignment_op_table_len

ssize_t pair_assignment_op_table_len = NUM_ELEMENTS(pair_assignment_op_table)
static

Definition at line 63 of file pair_legacy.c.

◆ pair_comparison_op_table

fr_table_num_sorted_t const pair_comparison_op_table[]
static
Initial value:
= {
{ L("!*"), T_OP_CMP_FALSE },
{ L("!="), T_OP_NE },
{ L("!~"), T_OP_REG_NE },
{ L("+="), T_OP_ADD_EQ },
{ L(":="), T_OP_SET },
{ L("<"), T_OP_LT },
{ L("<="), T_OP_LE },
{ L("="), T_OP_EQ },
{ L("=*"), T_OP_CMP_TRUE },
{ L("=="), T_OP_CMP_EQ },
{ L("=~"), T_OP_REG_EQ },
{ L(">"), T_OP_GT },
{ L(">="), T_OP_GE }
}
@ T_OP_CMP_TRUE
Definition token.h:104
@ T_OP_NE
Definition token.h:97
@ T_OP_CMP_FALSE
Definition token.h:105
@ T_OP_REG_EQ
Definition token.h:102
@ T_OP_CMP_EQ
Definition token.h:106
@ T_OP_LE
Definition token.h:100
@ T_OP_GE
Definition token.h:98
@ T_OP_GT
Definition token.h:99
@ T_OP_LT
Definition token.h:101
@ T_OP_REG_NE
Definition token.h:103

Definition at line 65 of file pair_legacy.c.

◆ pair_comparison_op_table_len

size_t pair_comparison_op_table_len = NUM_ELEMENTS(pair_comparison_op_table)
static

Definition at line 80 of file pair_legacy.c.