#ifndef lint
static char copyright[] =
-"$Id: tree.c,v 1.91 2000/11/24 04:08:31 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tree.c,v 1.92 2000/11/28 23:23:13 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
return 1;
}
-int evaluate_expression (result, packet, lease,
+int evaluate_expression (result, packet, lease, client_state,
in_options, cfg_options, scope, expr)
struct binding_value **result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
}
}
evaluate_expression (&nb -> value, packet, lease,
+ client_state,
in_options, cfg_options, scope,
arg -> data.arg.val);
nb -> next = ns -> bindings;
binding_scope_reference (&ns -> outer, *scope, MDL);
status = (execute_statements
- (&bv, packet, lease, in_options, cfg_options, &ns,
+ (&bv, packet,
+ lease, client_state, in_options, cfg_options, &ns,
binding -> value -> value.fundef -> statements));
binding_scope_dereference (&ns, MDL);
return 0;
bv -> type = binding_boolean;
status = (evaluate_boolean_expression
- (&bv -> value.boolean, packet, lease, in_options,
- cfg_options, scope, expr));
+ (&bv -> value.boolean, packet, lease, client_state,
+ in_options, cfg_options, scope, expr));
} else if (is_numeric_expression (expr)) {
if (!binding_value_allocate (&bv, MDL))
return 0;
bv -> type = binding_numeric;
status = (evaluate_numeric_expression
- (&bv -> value.intval, packet, lease, in_options,
- cfg_options, scope, expr));
+ (&bv -> value.intval, packet, lease, client_state,
+ in_options, cfg_options, scope, expr));
} else if (is_data_expression (expr)) {
if (!binding_value_allocate (&bv, MDL))
return 0;
bv -> type = binding_data;
status = (evaluate_data_expression
- (&bv -> value.data, packet, lease, in_options,
- cfg_options, scope, expr));
+ (&bv -> value.data, packet, lease, client_state,
+ in_options, cfg_options, scope, expr));
} else if (is_dns_expression (expr)) {
#if defined (NSUPDATE)
if (!binding_value_allocate (&bv, MDL))
return 0;
bv -> type = binding_dns;
status = (evaluate_dns_expression
- (&bv -> value.dns, packet, lease, in_options,
- cfg_options, scope, expr));
+ (&bv -> value.dns, packet, lease, client_state,
+ in_options, cfg_options, scope, expr));
#endif
} else {
log_error ("%s: invalid expression type: %d",
"evaluate_expression", expr -> op);
return 0;
}
- if (result)
+ if (result && status)
binding_value_reference (result, bv, MDL);
binding_value_dereference (&bv, MDL);
}
#if defined (NSUPDATE)
-int evaluate_dns_expression (result, packet, lease, in_options,
+int evaluate_dns_expression (result, packet, lease, client_state, in_options,
cfg_options, scope, expr)
ns_updrec **result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
#if defined (NSUPDATE)
case expr_ns_add:
r0 = evaluate_numeric_expression (&ttl, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.ns_add.ttl);
nsfinish:
memset (&name, 0, sizeof name);
r1 = evaluate_data_expression (&name, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.ns_add.rrname);
if (r1) {
tname [name.len] = 0;
memset (&data, 0, sizeof data);
r2 = evaluate_data_expression
- (&data, packet, lease, in_options,
- cfg_options, scope,
+ (&data, packet, lease, client_state,
+ in_options, cfg_options, scope,
expr -> data.ns_add.rrdata);
}
} else
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
log_error ("Numeric opcode in evaluate_dns_expression: %d",
expr -> op);
return 0;
}
#endif /* defined (NSUPDATE) */
-int evaluate_boolean_expression (result, packet, lease, in_options,
- cfg_options, scope, expr)
+int evaluate_boolean_expression (result, packet, lease, client_state,
+ in_options, cfg_options, scope, expr)
int *result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
case expr_not_equal:
memset (&left, 0, sizeof left);
sleft = evaluate_data_expression (&left, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.equal [0]);
memset (&right, 0, sizeof right);
sright = evaluate_data_expression (&right, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.equal [1]);
*result = expr -> op == expr_equal;
else
*result = expr -> op == expr_not_equal;
- }
- if (!sleft && !sright)
+ } else if (!sleft && !sright)
*result = expr -> op == expr_equal;
+ else
+ *result = expr -> op == expr_not_equal;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("bool: %sequal (%s, %s) = %s",
(sright
? print_hex_2 (right.len, right.data, 30)
: "NULL"),
- ((sleft && sright)
- ? (*result ? "true" : "false")
- : "NULL"));
+ (*result ? "true" : "false"));
#endif
if (sleft)
data_string_forget (&left, MDL);
if (sright)
data_string_forget (&right, MDL);
- return (sleft && sright) || (!sleft && !sright);
+ return 1;
case expr_and:
sleft = evaluate_boolean_expression (&bleft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
if (sleft && bleft)
sright = evaluate_boolean_expression
- (&bright, packet, lease,
+ (&bright, packet, lease, client_state,
in_options, cfg_options,
scope, expr -> data.and [1]);
else
case expr_or:
bleft = bright = 0;
sleft = evaluate_boolean_expression (&bleft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.or [0]);
if (!sleft || !bleft)
sright = evaluate_boolean_expression
- (&bright, packet, lease,
+ (&bright, packet, lease, client_state,
in_options, cfg_options,
scope, expr -> data.or [1]);
else
case expr_not:
sleft = evaluate_boolean_expression (&bleft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.not);
memset (&left, 0, sizeof left);
if (!in_options ||
!get_option (&left, expr -> data.exists -> universe,
- packet, lease, in_options, cfg_options,
- in_options,
+ packet, lease, client_state,
+ in_options, cfg_options, in_options,
scope, expr -> data.exists -> code))
*result = 0;
else {
log_debug ("bool: exists %s.%s = %s",
expr -> data.option -> universe -> name,
expr -> data.option -> name,
- *result ? "true" : MDL);
+ *result ? "true" : "false");
#endif
return 1;
*result = 0;
#if defined (DEBUG_EXPRESSIONS)
log_debug ("boolean: %s? = %s", expr -> data.variable,
- sleft ? "true" : "false");
+ *result ? "true" : "false");
#endif
return 1;
case expr_funcall:
bv = (struct binding_value *)0;
- sleft = evaluate_expression (&bv, packet, lease,
+ sleft = evaluate_expression (&bv, packet, lease, client_state,
in_options, cfg_options,
scope, expr);
if (sleft) {
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
log_error ("Numeric opcode in evaluate_boolean_expression: %d",
expr -> op);
return 0;
return 0;
}
-int evaluate_data_expression (result, packet, lease,
+int evaluate_data_expression (result, packet, lease, client_state,
in_options, cfg_options, scope, expr)
struct data_string *result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
case expr_substring:
memset (&data, 0, sizeof data);
s0 = evaluate_data_expression (&data, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.substring.expr);
/* Evaluate the offset and length. */
s1 = evaluate_numeric_expression
- (&offset, packet, lease, in_options, cfg_options,
- scope, expr -> data.substring.offset);
+ (&offset, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.substring.offset);
s2 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.substring.len);
case expr_suffix:
memset (&data, 0, sizeof data);
s0 = evaluate_data_expression (&data, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.suffix.expr);
/* Evaluate the length. */
s1 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.suffix.len);
if (in_options)
s0 = get_option (result,
expr -> data.option -> universe,
- packet, lease,
+ packet, lease, client_state,
in_options, cfg_options, in_options,
scope, expr -> data.option -> code);
else
if (cfg_options)
s0 = get_option (result,
expr -> data.option -> universe,
- packet, lease,
+ packet, lease, client_state,
in_options, cfg_options, cfg_options,
scope, expr -> data.option -> code);
else
}
s0 = evaluate_numeric_expression (&offset, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.packet.offset);
s1 = evaluate_numeric_expression (&len,
- packet, lease,
+ packet, lease, client_state,
in_options, cfg_options,
scope,
expr -> data.packet.len);
case expr_encapsulate:
if (cfg_options)
s0 = option_space_encapsulate
- (result, packet, lease,
+ (result, packet, lease, client_state,
in_options, cfg_options, scope,
&expr -> data.encapsulate);
else
case expr_concat:
memset (&data, 0, sizeof data);
s0 = evaluate_data_expression (&data, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.concat [0]);
memset (&other, 0, sizeof other);
s1 = evaluate_data_expression (&other, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.concat [1]);
case expr_encode_int8:
s0 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.encode_int);
case expr_encode_int16:
s0 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.encode_int);
case expr_encode_int32:
s0 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.encode_int);
case expr_binary_to_ascii:
/* Evaluate the base (offset) and width (len): */
s0 = evaluate_numeric_expression
- (&offset, packet, lease, in_options, cfg_options,
- scope, expr -> data.b2a.base);
+ (&offset, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.b2a.base);
s1 = evaluate_numeric_expression (&len, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.b2a.width);
/* Evaluate the seperator string. */
memset (&data, 0, sizeof data);
s2 = evaluate_data_expression (&data, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.b2a.seperator);
/* Evaluate the data to be converted. */
memset (&other, 0, sizeof other);
s3 = evaluate_data_expression (&other, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.b2a.buffer);
case expr_reverse:
/* Evaluate the width (len): */
s0 = evaluate_numeric_expression
- (&len, packet, lease, in_options, cfg_options,
- scope, expr -> data.reverse.width);
+ (&len, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.reverse.width);
/* Evaluate the data. */
memset (&data, 0, sizeof data);
s1 = evaluate_data_expression (&data, packet, lease,
+ client_state,
in_options, cfg_options, scope,
expr -> data.reverse.buffer);
case expr_pick_first_value:
memset (&data, 0, sizeof data);
if ((evaluate_data_expression
- (result, packet, lease, in_options, cfg_options, scope,
- expr -> data.pick_first_value.car))) {
+ (result, packet,
+ lease, client_state, in_options, cfg_options,
+ scope, expr -> data.pick_first_value.car))) {
#if defined (DEBUG_EXPRESSIONS)
log_debug ("data: pick_first_value (%s, ???)",
print_hex_1 (result -> len,
if (expr -> data.pick_first_value.cdr &&
(evaluate_data_expression
- (result, packet, lease, in_options, cfg_options, scope,
- expr -> data.pick_first_value.cdr))) {
+ (result, packet,
+ lease, client_state, in_options, cfg_options,
+ scope, expr -> data.pick_first_value.cdr))) {
#if defined (DEBUG_EXPRESSIONS)
log_debug ("data: pick_first_value (NULL, %s)",
print_hex_1 (result -> len,
case expr_funcall:
bv = (struct binding_value *)0;
- s0 = evaluate_expression (&bv, packet, lease,
+ s0 = evaluate_expression (&bv, packet, lease, client_state,
in_options, cfg_options,
scope, expr);
if (s0) {
#if defined (DEBUG_EXPRESSIONS)
log_info ("data: filename = \"%s\"",
- s0 ? (char *)(result -> data) : "NULL");
+ s0 ? (const char *)(result -> data) : "NULL");
#endif
return s0;
#if defined (DEBUG_EXPRESSIONS)
log_info ("data: sname = \"%s\"",
- s0 ? (char *)(result -> data) : "NULL");
+ s0 ? (const char *)(result -> data) : "NULL");
#endif
return s0;
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
log_error ("Numeric opcode in evaluate_data_expression: %d",
expr -> op);
return 0;
return 0;
}
-int evaluate_numeric_expression (result, packet, lease,
+int evaluate_numeric_expression (result, packet, lease, client_state,
in_options, cfg_options, scope, expr)
unsigned long *result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
case expr_extract_int8:
memset (&data, 0, sizeof data);
status = evaluate_data_expression
- (&data, packet, lease, in_options, cfg_options,
- scope, expr -> data.extract_int);
+ (&data, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.extract_int);
if (status)
*result = data.data [0];
#if defined (DEBUG_EXPRESSIONS)
case expr_extract_int16:
memset (&data, 0, sizeof data);
status = (evaluate_data_expression
- (&data, packet, lease, in_options, cfg_options,
- scope, expr -> data.extract_int));
+ (&data, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.extract_int));
if (status && data.len >= 2)
*result = getUShort (data.data);
#if defined (DEBUG_EXPRESSIONS)
case expr_extract_int32:
memset (&data, 0, sizeof data);
status = (evaluate_data_expression
- (&data, packet, lease, in_options, cfg_options,
- scope, expr -> data.extract_int));
+ (&data, packet, lease, client_state, in_options,
+ cfg_options, scope, expr -> data.extract_int));
if (status && data.len >= 4)
*result = getULong (data.data);
#if defined (DEBUG_EXPRESSIONS)
next = cur -> data.dns_transaction.cdr;
nut = 0;
status = (evaluate_dns_expression
- (&nut, packet, lease, in_options, cfg_options,
+ (&nut, packet,
+ lease, client_state, in_options, cfg_options,
scope, cur -> data.dns_transaction.car));
if (!status)
goto dns_bad;
} else
status = 0;
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("numeric: %s = %s", expr -> data.variable,
- status ? *result : 0);
+ if (status)
+ log_debug ("numeric: %s = %ld",
+ expr -> data.variable, *result);
+ else
+ log_debug ("numeric: %s = NULL",
+ expr -> data.variable);
#endif
return status;
case expr_funcall:
bv = (struct binding_value *)0;
status = evaluate_expression (&bv, packet, lease,
+ client_state,
in_options, cfg_options,
scope, expr);
if (status) {
binding_value_dereference (&bv, MDL);
}
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("data: %s = %d", expr -> data.funcall.name,
+ log_debug ("data: %s = %ld", expr -> data.funcall.name,
status ? *result : 0);
#endif
break;
case expr_add:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d + %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft + iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld + %ld = %ld",
+ ileft, iright, ileft + iright);
+ else if (sleft)
+ log_debug ("num: %ld + NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL + %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft + iright;
case expr_subtract:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d - %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft - iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld - %ld = %ld",
+ ileft, iright, ileft - iright);
+ else if (sleft)
+ log_debug ("num: %ld - NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL - %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft - iright;
case expr_multiply:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d * %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft * iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld * %ld = %ld",
+ ileft, iright, ileft * iright);
+ else if (sleft)
+ log_debug ("num: %ld * NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL * %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft * iright;
case expr_divide:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d / %d = %d",
- ileft, iright,
- ((sleft && sright && iright) ? (ileft / iright) : 0));
+ if (sleft && sright) {
+ if (iright != 0)
+ log_debug ("num: %ld / %ld = %ld",
+ ileft, iright, ileft / iright);
+ else
+ log_debug ("num: %ld / %ld = NULL",
+ ileft, iright);
+ } else if (sleft)
+ log_debug ("num: %ld / NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL / %ld = NULL", iright);
#endif
if (sleft && sright && iright) {
*result = ileft / iright;
case expr_remainder:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d %% %d = %d",
- ileft, iright,
- ((sleft && sright && iright) ? (ileft % iright) : 0));
+ if (sleft && sright) {
+ if (iright != 0)
+ log_debug ("num: %ld %% %ld = %ld",
+ ileft, iright, ileft % iright);
+ else
+ log_debug ("num: %ld %% %ld = NULL",
+ ileft, iright);
+ } else if (sleft)
+ log_debug ("num: %ld %% NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL %% %ld = NULL", iright);
#endif
if (sleft && sright && iright) {
*result = ileft % iright;
case expr_binary_and:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d & %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft & iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld | %ld = %ld",
+ ileft, iright, ileft & iright);
+ else if (sleft)
+ log_debug ("num: %ld & NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL & %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft & iright;
case expr_binary_or:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d | %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft | iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld | %ld = %ld",
+ ileft, iright, ileft | iright);
+ else if (sleft)
+ log_debug ("num: %ld | NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL | %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft | iright;
case expr_binary_xor:
sleft = evaluate_numeric_expression (&ileft, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [0]);
sright = evaluate_numeric_expression (&iright, packet, lease,
+ client_state,
in_options, cfg_options,
scope,
expr -> data.and [1]);
#if defined (DEBUG_EXPRESSIONS)
- log_debug ("num: %d ^ %d = %d",
- ileft, iright,
- ((sleft && sright) ? (ileft ^ iright) : 0));
+ if (sleft && sright)
+ log_debug ("num: %ld ^ %ld = %ld",
+ ileft, iright, ileft ^ iright);
+ else if (sleft)
+ log_debug ("num: %ld ^ NULL = NULL", ileft);
+ else
+ log_debug ("num: NULL ^ %ld = NULL", iright);
#endif
if (sleft && sright) {
*result = ileft ^ iright;
}
return 0;
+ case expr_client_state:
+ if (client_state) {
+#if defined (DEBUG_EXPRESSIONS)
+ log_debug ("num: client-state = %d",
+ client_state -> state);
+#endif
+ *result = client_state -> state;
+ return 1;
+ } else {
+#if defined (DEBUG_EXPRESSIONS)
+ log_debug ("num: client-state = NULL");
+#endif
+ return 0;
+ }
+
case expr_ns_add:
case expr_ns_delete:
case expr_ns_exists:
result of that evaluation. There should never be both an expression
and a valid data_string. */
-int evaluate_option_cache (result, packet, lease,
+int evaluate_option_cache (result, packet, lease, client_state,
in_options, cfg_options, scope, oc, file, line)
struct data_string *result;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
}
if (!oc -> expression)
return 0;
- return evaluate_data_expression (result, packet, lease,
+ return evaluate_data_expression (result, packet, lease, client_state,
in_options, cfg_options, scope,
oc -> expression);
}
/* Evaluate an option cache and extract a boolean from the result,
returning the boolean. Return false if there is no data. */
-int evaluate_boolean_option_cache (ignorep, packet, lease, in_options,
+int evaluate_boolean_option_cache (ignorep, packet,
+ lease, client_state, in_options,
cfg_options, scope, oc, file, line)
int *ignorep;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
return 0;
memset (&ds, 0, sizeof ds);
- if (!evaluate_option_cache (&ds, packet, lease, in_options,
+ if (!evaluate_option_cache (&ds, packet,
+ lease, client_state, in_options,
cfg_options, scope, oc, file, line))
return 0;
/* Evaluate a boolean expression and return the result of the evaluation,
or FALSE if it failed. */
-int evaluate_boolean_expression_result (ignorep, packet, lease, in_options,
- cfg_options, scope, expr)
+int evaluate_boolean_expression_result (ignorep, packet, lease, client_state,
+ in_options, cfg_options, scope, expr)
int *ignorep;
struct packet *packet;
struct lease *lease;
+ struct client_state *client_state;
struct option_state *in_options;
struct option_state *cfg_options;
struct binding_scope **scope;
if (!expr)
return 0;
- if (!evaluate_boolean_expression (&result, packet, lease,
+ if (!evaluate_boolean_expression (&result, packet, lease, client_state,
in_options, cfg_options,
scope, expr))
return 0;
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
if (expr -> data.equal [0])
expression_dereference (&expr -> data.equal [0],
file, line);
expr -> op == expr_remainder ||
expr -> op == expr_binary_and ||
expr -> op == expr_binary_or ||
- expr -> op == expr_binary_xor);
+ expr -> op == expr_binary_xor ||
+ expr -> op == expr_client_state);
}
int is_compound_expression (expr)
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
return 100;
case expr_equal:
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
return context_numeric;
}
return context_any;
"leased-address");
break;
+ case expr_client_state:
+ col = token_print_indent (file, col, indent, "", "",
+ "client-state");
+ break;
+
case expr_binary_to_ascii:
col = token_print_indent (file, col, indent, "", "",
"binary-to-ascii");
case expr_binary_and:
case expr_binary_or:
case expr_binary_xor:
+ case expr_client_state:
return 0;
}
return 0;