#ifndef lint
static char copyright[] =
-"$Id: parse.c,v 1.30 1999/07/19 01:15:11 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
+"$Id: parse.c,v 1.31 1999/07/19 15:35:47 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
case DNS_UPDATE:
#if !defined (NSUPDATE)
- parse_warn ("you are using dns-update() but have not compiled with the NSUPDATE switch.");
- skip_to_semi (cfile);
- *lose = 1;
- return 0;
+ parse_warn ("Please rebuild dhcpd with --with-nsupdate.");
#endif
token = next_token (&val, cfile);
- if (!expression_allocate (expr, "parse_expression: DNS_UPDATE"))
+ if (!expression_allocate (expr,
+ "parse_expression: DNS_UPDATE"))
log_fatal ("can't allocate expression");
(*expr) -> op = expr_dns_update;
if (token != COMMA)
goto nocomma;
- if (!(parse_data_expression
+ if (!(parse_numeric_expression
(&(*expr) -> data.dns_update.ttl, cfile, lose))) {
expression_dereference (expr,
"parse_expression: nottl");
case CONFIG_OPTION:
if (!expression_allocate (expr, "parse_expression: OPTION"))
log_fatal ("can't allocate expression");
- (*expr) -> op = token == (OPTION
- ? expr_option
- : expr_config_option);
+ (*expr) -> op = (token == OPTION
+ ? expr_option
+ : expr_config_option);
token = next_token (&val, cfile);
(*expr) -> data.option = parse_option_name (cfile, 0);
if (!(*expr) -> data.option) {
#ifndef lint
static char copyright[] =
-"$Id: tree.c,v 1.36 1999/07/19 13:08:29 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
+"$Id: tree.c,v 1.37 1999/07/19 15:35:48 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
struct expression *expr;
{
struct data_string left, right;
- struct data_string rrtype, expr1, expr2, ttl;
+ struct data_string rrtype, expr1, expr2;
+ int ttl;
int s0, s1, s2, s3;
int bleft, bright;
int sleft, sright;
memset (&expr2, 0, sizeof expr2);
s2 = evaluate_data_expression (&expr2, packet, options, lease,
expr -> data.dns_update.expr2);
- memset (&ttl, 0, sizeof ttl);
- s3 = evaluate_data_expression (&ttl, packet, options, lease,
+ s3 = evaluate_numeric_expression (&ttl, packet, options, lease,
expr -> data.dns_update.ttl);
*result = 0; /* assume failure */
if (s0 && s1 && s2 && s3) {
if (rrtype.len == 1 &&
strncmp(rrtype.data, "a", 1) == 0) {
-log_info("calling updateA(expr1, expr2, %d, lease)", atol(ttl.data));
- updateA(expr1, expr2, atol(ttl.data), lease);
+log_info("calling updateA(expr1, expr2, %d, lease)", ttl);
+ updateA(expr1, expr2, ttl, lease);
} else if (rrtype.len == 3 &&
strncmp(rrtype.data, "ptr", 3) == 0) {
-log_info("calling updatePTR(expr1, expr2, %d, lease)", atol(ttl.data));
- updatePTR(expr1, expr2, atol(ttl.data), lease);
+log_info("calling updatePTR(expr1, expr2, %d, lease)", ttl);
+ updatePTR(expr1, expr2, ttl, lease);
}
*result = 1;
}
case expr_host_decl_name:
case expr_config_option:
case expr_leased_address:
- case expr_lease_time:
log_error ("Data opcode in evaluate_boolean_expression: %d",
expr -> op);
return 0;
case expr_extract_int16:
case expr_extract_int32:
case expr_const_int:
+ case expr_lease_time:
log_error ("Numeric opcode in evaluate_boolean_expression: %d",
expr -> op);
return 0;
#endif
return 1;
- case expr_lease_time:
- if (!lease) {
- log_error ("data: leased_lease_time: not available");
- return 0;
- }
- i = lease -> ends - cur_time;
- if (buffer_allocate (&result -> buffer, 11, "lease-time")) {
- result -> data = &result -> buffer -> data [0];
-#if defined (NO_SNPRINTF)
- sprintf (result -> data, "%lu", i);
-#else
- snprintf (result -> data, 11, "%lu", i);
-#endif
- result -> len = strlen (result -> data);
- result -> terminated = 0;
- } else {
- log_error ("data: lease-time: no memory.");
- return 0;
- }
-#if defined (DEBUG_EXPRESSIONS)
- log_debug ("data: lease-time = %s",
- print_hex_1 (result -> len, result -> data, 60));
-#endif
- return 1;
-
case expr_check:
case expr_equal:
case expr_and:
case expr_extract_int16:
case expr_extract_int32:
case expr_const_int:
+ case expr_lease_time:
log_error ("Numeric opcode in evaluate_data_expression: %d",
expr -> op);
return 0;
case expr_const_int:
*result = expr -> data.const_int;
+#if defined (DEBUG_EXPRESSIONS)
+ log_debug ("number: CONSTANT = %d", *result);
+#endif
return 1;
+ case expr_lease_time:
+ if (!lease) {
+ log_error ("data: leased_lease_time: not available");
+ return 0;
+ }
+ *result = lease -> ends - cur_time;
+#if defined (DEBUG_EXPRESSIONS)
+ log_debug ("number: lease-time = %d", *result);
+#endif
+ return 1;
+
}
log_error ("evaluate_numeric_expression: bogus opcode %d", expr -> op);
expr -> op == expr_host_lookup ||
expr -> op == expr_binary_to_ascii ||
expr -> op == expr_reverse ||
- expr -> op == expr_leased_address ||
- expr -> op == expr_lease_time);
+ expr -> op == expr_leased_address);
}
int is_numeric_expression (expr)
return (expr -> op == expr_extract_int8 ||
expr -> op == expr_extract_int16 ||
expr -> op == expr_extract_int32 ||
- expr -> op == expr_const_int);
+ expr -> op == expr_const_int ||
+ expr -> op == expr_lease_time);
}
static int op_val PROTO ((enum expr_op));
case expr_host_decl_name:
case expr_config_option:
case expr_leased_address:
+ case expr_lease_time:
return 100;
case expr_equal:
case expr_host_decl_name:
case expr_config_option:
case expr_leased_address:
+ case expr_lease_time:
return context_any;
case expr_equal: