mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-28 21:07:43 +00:00
Support encapsulate expression. lookup_func -> get_func.
This commit is contained in:
parent
ccff5ae188
commit
dd6e44a55b
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char copyright[] =
|
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 */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
@ -129,7 +129,7 @@ int make_const_data (expr, data, len, terminated, allocate)
|
|||||||
if (!buffer_allocate (&nt -> data.const_data.buffer,
|
if (!buffer_allocate (&nt -> data.const_data.buffer,
|
||||||
len + terminated,
|
len + terminated,
|
||||||
"make_const_data")) {
|
"make_const_data")) {
|
||||||
log_error ("Can't allocate const_data buffer.");
|
log_error ("Can't allocate const_data buffer");
|
||||||
expression_dereference (expr,
|
expression_dereference (expr,
|
||||||
"make_const_data");
|
"make_const_data");
|
||||||
return 0;
|
return 0;
|
||||||
@ -181,6 +181,22 @@ int make_concat (expr, left, right)
|
|||||||
return 1;
|
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)
|
int make_substring (new, expr, offset, length)
|
||||||
struct expression **new;
|
struct expression **new;
|
||||||
struct expression *expr;
|
struct expression *expr;
|
||||||
@ -468,8 +484,9 @@ int evaluate_boolean_expression (result, packet, options, expr)
|
|||||||
|
|
||||||
case expr_exists:
|
case expr_exists:
|
||||||
memset (&left, 0, sizeof left);
|
memset (&left, 0, sizeof left);
|
||||||
if (!((*expr -> data.option -> universe -> lookup_func)
|
if (!((*expr -> data.option -> universe -> get_func)
|
||||||
(&left, options, expr -> data.exists -> code)))
|
(&left, expr -> data.exists -> universe,
|
||||||
|
options, expr -> data.exists -> code)))
|
||||||
*result = 0;
|
*result = 0;
|
||||||
else {
|
else {
|
||||||
*result = 1;
|
*result = 1;
|
||||||
@ -490,6 +507,7 @@ int evaluate_boolean_expression (result, packet, options, expr)
|
|||||||
case expr_const_data:
|
case expr_const_data:
|
||||||
case expr_packet:
|
case expr_packet:
|
||||||
case expr_concat:
|
case expr_concat:
|
||||||
|
case expr_encapsulate:
|
||||||
case expr_host_lookup:
|
case expr_host_lookup:
|
||||||
log_error ("Data opcode in evaluate_boolean_expression: %d",
|
log_error ("Data opcode in evaluate_boolean_expression: %d",
|
||||||
expr -> op);
|
expr -> op);
|
||||||
@ -599,9 +617,9 @@ int evaluate_data_expression (result, packet, options, expr)
|
|||||||
|
|
||||||
/* Extract an option. */
|
/* Extract an option. */
|
||||||
case expr_option:
|
case expr_option:
|
||||||
s0 = ((*expr -> data.option -> universe -> lookup_func)
|
s0 = ((*expr -> data.option -> universe -> get_func)
|
||||||
(result, &packet -> options,
|
(result, expr -> data.option -> universe,
|
||||||
expr -> data.option -> code));
|
packet -> options, expr -> data.option -> code));
|
||||||
#if defined (DEBUG_EXPRESSIONS)
|
#if defined (DEBUG_EXPRESSIONS)
|
||||||
log_info ("data: option %s.%s = %s",
|
log_info ("data: option %s.%s = %s",
|
||||||
expr -> data.option -> universe -> name,
|
expr -> data.option -> universe -> name,
|
||||||
@ -679,6 +697,19 @@ int evaluate_data_expression (result, packet, options, expr)
|
|||||||
#endif
|
#endif
|
||||||
return s2;
|
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... */
|
/* Some constant data... */
|
||||||
case expr_const_data:
|
case expr_const_data:
|
||||||
#if defined (DEBUG_EXPRESSIONS)
|
#if defined (DEBUG_EXPRESSIONS)
|
||||||
@ -792,6 +823,7 @@ int evaluate_numeric_expression (result, packet, options, expr)
|
|||||||
case expr_const_data:
|
case expr_const_data:
|
||||||
case expr_packet:
|
case expr_packet:
|
||||||
case expr_concat:
|
case expr_concat:
|
||||||
|
case expr_encapsulate:
|
||||||
case expr_host_lookup:
|
case expr_host_lookup:
|
||||||
log_error ("Data opcode in evaluate_numeric_expression: %d",
|
log_error ("Data opcode in evaluate_numeric_expression: %d",
|
||||||
expr -> op);
|
expr -> op);
|
||||||
@ -1003,6 +1035,7 @@ void expression_dereference (eptr, name)
|
|||||||
name);
|
name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case expr_encapsulate:
|
||||||
case expr_const_data:
|
case expr_const_data:
|
||||||
data_string_forget (&expr -> data.const_data, name);
|
data_string_forget (&expr -> data.const_data, name);
|
||||||
break;
|
break;
|
||||||
@ -1028,46 +1061,6 @@ void expression_dereference (eptr, name)
|
|||||||
free_expression (expr, "expression_dereference");
|
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
|
/* Make a copy of the data in data_string, upping the buffer reference
|
||||||
count if there's a buffer. */
|
count if there's a buffer. */
|
||||||
|
|
||||||
@ -1128,6 +1121,7 @@ int is_data_expression (expr)
|
|||||||
expr -> op == expr_const_data ||
|
expr -> op == expr_const_data ||
|
||||||
expr -> op == expr_packet ||
|
expr -> op == expr_packet ||
|
||||||
expr -> op == expr_concat ||
|
expr -> op == expr_concat ||
|
||||||
|
expr -> op == expr_encapsulate ||
|
||||||
expr -> op == expr_host_lookup);
|
expr -> op == expr_host_lookup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1152,6 +1146,7 @@ static int op_val (op)
|
|||||||
case expr_substring:
|
case expr_substring:
|
||||||
case expr_suffix:
|
case expr_suffix:
|
||||||
case expr_concat:
|
case expr_concat:
|
||||||
|
case expr_encapsulate:
|
||||||
case expr_host_lookup:
|
case expr_host_lookup:
|
||||||
case expr_not:
|
case expr_not:
|
||||||
case expr_option:
|
case expr_option:
|
||||||
@ -1195,6 +1190,7 @@ enum expression_context op_context (op)
|
|||||||
case expr_substring:
|
case expr_substring:
|
||||||
case expr_suffix:
|
case expr_suffix:
|
||||||
case expr_concat:
|
case expr_concat:
|
||||||
|
case expr_encapsulate:
|
||||||
case expr_host_lookup:
|
case expr_host_lookup:
|
||||||
case expr_not:
|
case expr_not:
|
||||||
case expr_option:
|
case expr_option:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user