From 87a05fc1427acec77b24d140edd29c2858dbafad Mon Sep 17 00:00:00 2001 From: Tomek Mrugalski Date: Thu, 21 Apr 2011 18:14:58 +0000 Subject: [PATCH] - Parameters configured to evaluate from user defined function calls can now be correctly written to dhcpd.leases. - If a 'next-server' parameter is configured in a dynamic host record via OMAPI as a domain name, the syntax written to disk is now correctly parsed upon restart. [ISC-Bugs #22266] --- RELNOTES | 8 ++++++++ common/conflex.c | 2 ++ common/parse.c | 25 +++++++++++++++++++++++++ common/tree.c | 21 +++++++++++++++++++++ includes/dhctoken.h | 3 ++- 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/RELNOTES b/RELNOTES index bf460ad82..2e395a535 100644 --- a/RELNOTES +++ b/RELNOTES @@ -89,6 +89,14 @@ work on other platforms. Please report any problems and suggested fixes to client now adds the server to the reject list ACL and returns to INIT state to hopefully find an RFC 2131 compliant server (or retry in INIT forever). [ISC-Bugs #19660] + +- Parameters configured to evaluate from user defined function calls can + now be correctly written to dhcpd.leases (as on 'on events' or dynamic + host records inserted via OMAPI). [ISC-Bugs #22266] + +- If a 'next-server' parameter is configured in a dynamic host record via + OMAPI as a domain name, the syntax written to disk is now correctly parsed + upon restart. [ISC-Bugs #22266] Changes since 4.2.1rc1 diff --git a/common/conflex.c b/common/conflex.c index 4a84ee6c5..d5dd411d3 100644 --- a/common/conflex.c +++ b/common/conflex.c @@ -999,6 +999,8 @@ intern(char *atom, enum dhcp_token dfv) { if (!strncasecmp(atom + 1, "et", 2)) { if (!strcasecmp(atom + 3, "-lease-hostnames")) return GET_LEASE_HOSTNAMES; + if (!strcasecmp(atom + 3, "hostbyname")) + return GETHOSTBYNAME; if (!strcasecmp(atom + 3, "hostname")) return GETHOSTNAME; break; diff --git a/common/parse.c b/common/parse.c index 865522eeb..105df77ce 100644 --- a/common/parse.c +++ b/common/parse.c @@ -4551,6 +4551,31 @@ int parse_non_binary (expr, cfile, lose, context) goto norparen; break; + case GETHOSTBYNAME: + token = next_token(&val, NULL, cfile); + + token = next_token(NULL, NULL, cfile); + if (token != LPAREN) + goto nolparen; + + /* The argument is a quoted string. */ + token = next_token(&val, NULL, cfile); + if (token != STRING) { + parse_warn(cfile, "Expecting quoted literal: " + "\"foo.example.com\""); + skip_to_semi(cfile); + *lose = 1; + return 0; + } + if (!make_host_lookup(expr, val)) + log_fatal("Error creating gethostbyname() internal " + "record. (%s:%d)", MDL); + + token = next_token(NULL, NULL, cfile); + if (token != RPAREN) + goto norparen; + break; + /* Not a valid start to an expression... */ default: if (token != NAME && token != NUMBER_OR_NAME) diff --git a/common/tree.c b/common/tree.c index c30e086e7..d09717d42 100644 --- a/common/tree.c +++ b/common/tree.c @@ -4029,6 +4029,27 @@ int write_expression (file, expr, col, indent, firstp) "gethostname()"); break; + case expr_funcall: + col = token_print_indent(file, indent, indent, "", "", + expr->data.funcall.name); + col = token_print_indent(file, col, indent, " ", "", "("); + + firstp = 1; + e = expr->data.funcall.arglist; + while (e != NULL) { + if (!firstp) + col = token_print_indent(file, col, indent, + "", " ", ","); + + col = write_expression(file, e->data.arg.val, col, + indent, firstp); + firstp = 0; + e = e->data.arg.next; + } + + col = token_print_indent(file, col, indent, "", "", ")"); + break; + default: log_fatal ("invalid expression type in print_expression: %d", expr -> op); diff --git a/includes/dhctoken.h b/includes/dhctoken.h index 7c2ed4187..7fb8c8ce1 100644 --- a/includes/dhctoken.h +++ b/includes/dhctoken.h @@ -358,7 +358,8 @@ enum dhcp_token { AUTO_PARTNER_DOWN = 661, GETHOSTNAME = 662, REWIND = 663, - INITIAL_DELAY = 664 + INITIAL_DELAY = 664, + GETHOSTBYNAME = 665 }; #define is_identifier(x) ((x) >= FIRST_TOKEN && \ -- 2.47.3