mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-28 12:57:42 +00:00
Support encapsulate expression. lookup_func -> get_func.
This commit is contained in:
parent
ccff5ae188
commit
dd6e44a55b
@ -22,7 +22,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: tree.c,v 1.23 1999/03/16 05:50:37 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
|
||||
"$Id: tree.c,v 1.24 1999/04/05 16:28:09 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
@ -129,7 +129,7 @@ int make_const_data (expr, data, len, terminated, allocate)
|
||||
if (!buffer_allocate (&nt -> data.const_data.buffer,
|
||||
len + terminated,
|
||||
"make_const_data")) {
|
||||
log_error ("Can't allocate const_data buffer.");
|
||||
log_error ("Can't allocate const_data buffer");
|
||||
expression_dereference (expr,
|
||||
"make_const_data");
|
||||
return 0;
|
||||
@ -181,6 +181,22 @@ int make_concat (expr, left, right)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int make_encapsulation (expr, name)
|
||||
struct expression **expr;
|
||||
struct data_string *name;
|
||||
{
|
||||
/* Allocate a new node to store the encapsulation. */
|
||||
if (!expression_allocate (expr, "make_encapsulation")) {
|
||||
log_error ("No memory for encapsulation expression node.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
(*expr) -> op = expr_encapsulate;
|
||||
data_string_copy (&(*expr) -> data.encapsulate,
|
||||
name, "make_concat");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int make_substring (new, expr, offset, length)
|
||||
struct expression **new;
|
||||
struct expression *expr;
|
||||
@ -468,8 +484,9 @@ int evaluate_boolean_expression (result, packet, options, expr)
|
||||
|
||||
case expr_exists:
|
||||
memset (&left, 0, sizeof left);
|
||||
if (!((*expr -> data.option -> universe -> lookup_func)
|
||||
(&left, options, expr -> data.exists -> code)))
|
||||
if (!((*expr -> data.option -> universe -> get_func)
|
||||
(&left, expr -> data.exists -> universe,
|
||||
options, expr -> data.exists -> code)))
|
||||
*result = 0;
|
||||
else {
|
||||
*result = 1;
|
||||
@ -490,6 +507,7 @@ int evaluate_boolean_expression (result, packet, options, expr)
|
||||
case expr_const_data:
|
||||
case expr_packet:
|
||||
case expr_concat:
|
||||
case expr_encapsulate:
|
||||
case expr_host_lookup:
|
||||
log_error ("Data opcode in evaluate_boolean_expression: %d",
|
||||
expr -> op);
|
||||
@ -599,9 +617,9 @@ int evaluate_data_expression (result, packet, options, expr)
|
||||
|
||||
/* Extract an option. */
|
||||
case expr_option:
|
||||
s0 = ((*expr -> data.option -> universe -> lookup_func)
|
||||
(result, &packet -> options,
|
||||
expr -> data.option -> code));
|
||||
s0 = ((*expr -> data.option -> universe -> get_func)
|
||||
(result, expr -> data.option -> universe,
|
||||
packet -> options, expr -> data.option -> code));
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_info ("data: option %s.%s = %s",
|
||||
expr -> data.option -> universe -> name,
|
||||
@ -679,6 +697,19 @@ int evaluate_data_expression (result, packet, options, expr)
|
||||
#endif
|
||||
return s2;
|
||||
|
||||
/* The encapsulation of all defined options in an
|
||||
option space... */
|
||||
case expr_encapsulate:
|
||||
memset (&data, 0, sizeof data);
|
||||
s0 = option_space_encapsulate (&data, packet -> options,
|
||||
&expr -> data.encapsulate);
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
log_info ("data: encapsulate = %s",
|
||||
print_hex_1 (expr -> data.const_data.len,
|
||||
expr -> data.const_data.data, 60));
|
||||
#endif
|
||||
return s1;
|
||||
|
||||
/* Some constant data... */
|
||||
case expr_const_data:
|
||||
#if defined (DEBUG_EXPRESSIONS)
|
||||
@ -792,6 +823,7 @@ int evaluate_numeric_expression (result, packet, options, expr)
|
||||
case expr_const_data:
|
||||
case expr_packet:
|
||||
case expr_concat:
|
||||
case expr_encapsulate:
|
||||
case expr_host_lookup:
|
||||
log_error ("Data opcode in evaluate_numeric_expression: %d",
|
||||
expr -> op);
|
||||
@ -1003,6 +1035,7 @@ void expression_dereference (eptr, name)
|
||||
name);
|
||||
break;
|
||||
|
||||
case expr_encapsulate:
|
||||
case expr_const_data:
|
||||
data_string_forget (&expr -> data.const_data, name);
|
||||
break;
|
||||
@ -1028,46 +1061,6 @@ void expression_dereference (eptr, name)
|
||||
free_expression (expr, "expression_dereference");
|
||||
}
|
||||
|
||||
|
||||
/* Free all of the state in an option state buffer. The buffer itself is
|
||||
not freed, since these buffers are always contained in other structures. */
|
||||
|
||||
void option_state_dereference (state)
|
||||
struct option_state *state;
|
||||
{
|
||||
int i;
|
||||
struct agent_options *a, *na;
|
||||
struct option_tag *ot, *not;
|
||||
pair cp, next;
|
||||
|
||||
/* Having done the cons_options(), we can release the tree_cache
|
||||
entries. */
|
||||
for (i = 0; i < OPTION_HASH_SIZE; i++) {
|
||||
for (cp = state -> dhcp_hash [i]; cp; cp = next) {
|
||||
next = cp -> cdr;
|
||||
option_cache_dereference
|
||||
((struct option_cache **)&cp -> car,
|
||||
"option_state_dereference");
|
||||
free_pair (cp, "option_state_dereference");
|
||||
}
|
||||
for (cp = state -> server_hash [i]; cp; cp = next) {
|
||||
next = cp -> cdr;
|
||||
option_cache_dereference
|
||||
((struct option_cache **)&cp -> car,
|
||||
"option_state_dereference");
|
||||
}
|
||||
}
|
||||
|
||||
/* We can also release the agent options, if any... */
|
||||
for (a = state -> agent_options; a; a = na) {
|
||||
na = a -> next;
|
||||
for (ot = a -> first; ot; ot = not) {
|
||||
not = ot -> next;
|
||||
free (ot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Make a copy of the data in data_string, upping the buffer reference
|
||||
count if there's a buffer. */
|
||||
|
||||
@ -1128,6 +1121,7 @@ int is_data_expression (expr)
|
||||
expr -> op == expr_const_data ||
|
||||
expr -> op == expr_packet ||
|
||||
expr -> op == expr_concat ||
|
||||
expr -> op == expr_encapsulate ||
|
||||
expr -> op == expr_host_lookup);
|
||||
}
|
||||
|
||||
@ -1152,6 +1146,7 @@ static int op_val (op)
|
||||
case expr_substring:
|
||||
case expr_suffix:
|
||||
case expr_concat:
|
||||
case expr_encapsulate:
|
||||
case expr_host_lookup:
|
||||
case expr_not:
|
||||
case expr_option:
|
||||
@ -1195,6 +1190,7 @@ enum expression_context op_context (op)
|
||||
case expr_substring:
|
||||
case expr_suffix:
|
||||
case expr_concat:
|
||||
case expr_encapsulate:
|
||||
case expr_host_lookup:
|
||||
case expr_not:
|
||||
case expr_option:
|
||||
|
Loading…
x
Reference in New Issue
Block a user