From: Tomek Mrugalski Date: Thu, 21 Apr 2011 17:53:48 +0000 (+0000) Subject: - Parameters configured to evaluate from user defined function calls can X-Git-Tag: v4_3_0a1~190 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=023fbaa03e1eee300d6267ab927fe540f064eaaf;p=thirdparty%2Fdhcp.git - 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] --- diff --git a/RELNOTES b/RELNOTES index 17c8f9c15..4ee77fa4b 100644 --- a/RELNOTES +++ b/RELNOTES @@ -90,6 +90,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.0 diff --git a/common/conflex.c b/common/conflex.c index 81515bf97..f9d985978 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 766cc5936..5bc1e0b63 100644 --- a/includes/dhctoken.h +++ b/includes/dhctoken.h @@ -359,7 +359,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 && \