]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
- Parameters configured to evaluate from user defined function calls can
authorTomek Mrugalski <tomek@isc.org>
Thu, 21 Apr 2011 17:53:48 +0000 (17:53 +0000)
committerTomek Mrugalski <tomek@isc.org>
Thu, 21 Apr 2011 17:53:48 +0000 (17:53 +0000)
  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
common/conflex.c
common/parse.c
common/tree.c
includes/dhctoken.h

index 17c8f9c15017416e1f267536ab0440660e7ce32f..4ee77fa4b232e40210975800166516b500ec02f6 100644 (file)
--- 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
 
index 81515bf9746cd191ca4f53dd16a3010faf000133..f9d98597812e8156cbc7052b8eeb3b5d16af65c8 100644 (file)
@@ -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;
index 865522eeb100427d2f66a3f804e8bf3db25ab7e0..105df77ce8fd54ae5e6acaf790d8867c6aa46b43 100644 (file)
@@ -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)
index c30e086e7db956d8d738c19ffc8b7e0dc6ae918a..d09717d4283b2d7d549582eea4090d85c5ffc54e 100644 (file)
@@ -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);
index 766cc593679cacac1a4a06ccbc4144a09e2659f4..5bc1e0b634fdf298f03531b22a2cb89f5f45903c 100644 (file)
@@ -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 &&  \