2
0
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:
Ted Lemon 1999-04-05 16:28:09 +00:00
parent ccff5ae188
commit dd6e44a55b

View File

@ -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: