#ifndef lint
static char copyright[] =
-"$Id: execute.c,v 1.40 2000/10/10 23:22:39 mellon Exp $ Copyright (c) 1998-2000 The Internet Software Consortium. All rights reserved.\n";
+"$Id: execute.c,v 1.41 2000/11/28 22:50:38 mellon Exp $ Copyright (c) 1998-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
#include <omapip/omapip_p.h>
-int execute_statements (result, packet, lease, in_options, out_options, scope,
- statements)
+int execute_statements (result, packet, lease, client_state,
+ in_options, out_options, scope, statements)
struct binding_value **result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *out_options;
struct binding_scope **scope;
log_debug ("exec: statements");
#endif
status = execute_statements (result, packet, lease,
- in_options, out_options,
- scope,
+ client_state, in_options,
+ out_options, scope,
r -> data.statements);
#if defined (DEBUG_EXPRESSIONS)
log_debug ("exec: statements returns %d", status);
log_debug ("exec: switch");
#endif
status = (find_matching_case
- (&e, packet, lease,
+ (&e, packet, lease, client_state,
in_options, out_options, scope,
r -> data.s_switch.expr,
r -> data.s_switch.statements));
#endif
if (status) {
if (!(execute_statements
- (result, packet, lease,
+ (result, packet, lease, client_state,
in_options, out_options, scope, e))) {
executable_statement_dereference
(&e, MDL);
case if_statement:
status = (evaluate_boolean_expression
- (&rc, packet, lease, in_options,
+ (&rc, packet,
+ lease, client_state, in_options,
out_options, scope, r -> data.ie.expr));
#if defined (DEBUG_EXPRESSIONS)
if (!status)
rc = 0;
if (!execute_statements
- (result, packet, lease,
+ (result, packet, lease, client_state,
in_options, out_options, scope,
rc ? r -> data.ie.true : r -> data.ie.false))
return 0;
case eval_statement:
status = evaluate_expression
((struct binding_value **)0,
- packet, lease, in_options,
+ packet, lease, client_state, in_options,
out_options, scope, r -> data.eval);
#if defined (DEBUG_EXPRESSIONS)
log_debug ("exec: evaluate: %s",
case return_statement:
status = evaluate_expression
- (result, packet, lease, in_options,
+ (result, packet,
+ lease, client_state, in_options,
out_options, scope, r -> data.retval);
#if defined (DEBUG_EXPRESSIONS)
log_debug ("exec: return: %s",
if (r -> op == set_statement) {
status = (evaluate_expression
(&binding -> value, packet,
- lease, in_options,
- out_options, scope,
- r -> data.set.expr));
+ lease, client_state,
+ in_options, out_options,
+ scope, r -> data.set.expr));
} else {
if (!(binding_value_allocate
(&binding -> value, MDL))) {
break;
}
binding = find_binding (*scope, r -> data.unset);
-#if defined (DEBUG_EXPRESSIONS)
- log_debug ("exec: unset %s", r -> data.unset);
-#endif
if (binding) {
if (binding -> value)
binding_value_dereference
if (ns && binding) {
status = (evaluate_expression
(&binding -> value, packet, lease,
+ client_state,
in_options, out_options,
scope, e -> data.set.expr));
binding -> next = ns -> bindings;
*scope, MDL);
execute_statements
(result, packet, lease,
+ client_state,
in_options, out_options,
&ns, e -> data.let.statements);
}
case log_statement:
memset (&ds, 0, sizeof ds);
status = (evaluate_data_expression
- (&ds, packet, lease, in_options,
+ (&ds, packet,
+ lease, client_state, in_options,
out_options, scope, r -> data.log.expr));
#if defined (DEBUG_EXPRESSIONS)
specific scopes, so we recursively traverse the scope list, executing
the most outer scope first. */
-void execute_statements_in_scope (result, packet, lease, in_options,
- out_options, scope, group, limiting_group)
+void execute_statements_in_scope (result, packet,
+ lease, client_state, in_options, out_options,
+ scope, group, limiting_group)
struct binding_value **result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *out_options;
struct binding_scope **scope;
}
if (group -> next)
- execute_statements_in_scope (result, packet, lease,
+ execute_statements_in_scope (result, packet,
+ lease, client_state,
in_options, out_options, scope,
group -> next, limiting_group);
- execute_statements (result, packet, lease, in_options, out_options,
- scope, group -> statements);
+ execute_statements (result, packet, lease, client_state, in_options,
+ out_options, scope, group -> statements);
}
/* Dereference or free any subexpressions of a statement being freed. */
int find_matching_case (struct executable_statement **ep,
struct packet *packet, struct lease *lease,
+ struct client_state *client_state,
struct option_state *in_options,
struct option_state *out_options,
struct binding_scope **scope,
memset (&cd, 0, sizeof cd);
status = (evaluate_data_expression (&ds, packet, lease,
- in_options, out_options,
- scope, expr));
+ client_state, in_options,
+ out_options, scope, expr));
if (status) {
for (s = stmt; s; s = s -> next) {
if (s -> op == case_statement) {
sub = (evaluate_data_expression
- (&cd, packet, lease, in_options,
- out_options, scope, s -> data.c_case));
+ (&cd, packet, lease, client_state,
+ in_options, out_options,
+ scope, s -> data.c_case));
if (sub && cd.len == ds.len &&
!memcmp (cd.data, ds.data, cd.len))
{
} else {
unsigned long n, c;
status = evaluate_numeric_expression (&n, packet, lease,
+ client_state,
in_options, out_options,
scope, expr);
for (s = stmt; s; s = s -> next) {
if (s -> op == case_statement) {
sub = (evaluate_numeric_expression
- (&c, packet, lease, in_options,
- out_options, scope, s -> data.c_case));
+ (&c, packet, lease, client_state,
+ in_options, out_options,
+ scope, s -> data.c_case));
if (sub && n == c) {
executable_statement_reference
(ep, s -> next, MDL);