diff options
author | Shawn Routhier <sar@isc.org> | 2013-10-14 15:53:24 -0700 |
---|---|---|
committer | Shawn Routhier <sar@isc.org> | 2013-10-14 15:53:24 -0700 |
commit | d7d9c0c7c36d37fc42e51987af77207ced36d9bf (patch) | |
tree | 2f7b49de9f03c1097c109e425f0034accc3e7de9 /common/parse.c | |
parent | 1d851cff2c59ba728cf6a862db9b1890967de317 (diff) | |
download | isc-dhcp-d7d9c0c7c36d37fc42e51987af77207ced36d9bf.tar.gz |
-n [master]
Add code to support the standards version of DDNS
Diffstat (limited to 'common/parse.c')
-rw-r--r-- | common/parse.c | 380 |
1 files changed, 7 insertions, 373 deletions
diff --git a/common/parse.c b/common/parse.c index ad31f8ab..d931b97c 100644 --- a/common/parse.c +++ b/common/parse.c @@ -3514,42 +3514,7 @@ int parse_numeric_expression (expr, cfile, lose) } return 1; } -#if defined (NSUPDATE_OLD) -/* - * dns-expression :== - * UPDATE LPAREN ns-class COMMA ns-type COMMA data-expression COMMA - * data-expression COMMA numeric-expression RPAREN - * DELETE LPAREN ns-class COMMA ns-type COMMA data-expression COMMA - * data-expression RPAREN - * EXISTS LPAREN ns-class COMMA ns-type COMMA data-expression COMMA - * data-expression RPAREN - * NOT EXISTS LPAREN ns-class COMMA ns-type COMMA data-expression COMMA - * data-expression RPAREN - * ns-class :== IN | CHAOS | HS | NUMBER - * ns-type :== A | PTR | MX | TXT | NUMBER - */ -int parse_dns_expression (expr, cfile, lose) - struct expression **expr; - struct parse *cfile; - int *lose; -{ - /* Parse an expression... */ - if (!parse_expression (expr, cfile, lose, context_dns, - (struct expression **)0, expr_none)) - return 0; - - if (!is_dns_expression (*expr) && - (*expr) -> op != expr_variable_reference && - (*expr) -> op != expr_funcall) { - expression_dereference (expr, MDL); - parse_warn (cfile, "Expecting a dns update subexpression."); - *lose = 1; - return 0; - } - return 1; -} -#endif /* NSUPDATE_OLD */ /* Parse a subexpression that does not contain a binary operator. */ int parse_non_binary (expr, cfile, lose, context) @@ -3564,11 +3529,6 @@ int parse_non_binary (expr, cfile, lose, context) struct expression *nexp, **ep; int known; char *cptr; -#if defined (NSUPDATE_OLD) - enum expr_op opcode; - const char *s; - unsigned long u; -#endif isc_result_t status; unsigned len; @@ -3600,17 +3560,11 @@ int parse_non_binary (expr, cfile, lose, context) break; case TOKEN_NOT: - skip_token(&val, (unsigned *)0, cfile); -#if defined(NSUPDATE_OLD) - if (context == context_dns) { - token = peek_token (&val, (unsigned *)0, cfile); - goto not_exists; - } -#endif + skip_token(&val, NULL, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); - (*expr) -> op = expr_not; - if (!parse_non_binary (&(*expr) -> data.not, + (*expr)->op = expr_not; + if (!parse_non_binary (&(*expr)->data.not, cfile, lose, context_boolean)) { if (!*lose) { parse_warn (cfile, "expression expected"); @@ -3618,7 +3572,7 @@ int parse_non_binary (expr, cfile, lose, context) } *lose = 1; expression_dereference (expr, MDL); - return 0; + return (0); } if (!is_boolean_expression ((*expr) -> data.not)) { *lose = 1; @@ -3650,14 +3604,10 @@ int parse_non_binary (expr, cfile, lose, context) break; case EXISTS: -#if defined(NSUPDATE_OLD) - if (context == context_dns) - goto ns_exists; -#endif - skip_token(&val, (unsigned *)0, cfile); + skip_token(&val, NULL, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); - (*expr) -> op = expr_exists; + (*expr)->op = expr_exists; known = 0; /* Pass reference directly to expression structure. */ status = parse_option_name(cfile, 0, &known, @@ -3666,7 +3616,7 @@ int parse_non_binary (expr, cfile, lose, context) (*expr)->data.option == NULL) { *lose = 1; expression_dereference (expr, MDL); - return 0; + return (0); } break; @@ -3967,285 +3917,6 @@ int parse_non_binary (expr, cfile, lose, context) goto norparen; break; -#if defined(NSUPDATE_OLD) - /* dns-update and dns-delete are present for historical - purposes, but are deprecated in favor of ns-update - in combination with update, delete, exists and not - exists. */ - case DNS_UPDATE: - case DNS_DELETE: -#if !defined (NSUPDATE) - parse_warn (cfile, - "Please rebuild dhcpd with --with-nsupdate."); -#endif - skip_token(&val, (unsigned *)0, cfile); - if (token == DNS_UPDATE) - opcode = expr_ns_add; - else - opcode = expr_ns_delete; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != LPAREN) - goto nolparen; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != STRING) { - parse_warn (cfile, - "parse_expression: expecting string."); - badnsupdate: - skip_to_semi (cfile); - *lose = 1; - return 0; - } - - if (!strcasecmp (val, "a")) - u = T_A; - else if (!strcasecmp (val, "aaaa")) - u = T_AAAA; - else if (!strcasecmp (val, "ptr")) - u = T_PTR; - else if (!strcasecmp (val, "mx")) - u = T_MX; - else if (!strcasecmp (val, "cname")) - u = T_CNAME; - else if (!strcasecmp (val, "TXT")) - u = T_TXT; - else { - parse_warn (cfile, "unexpected rrtype: %s", val); - goto badnsupdate; - } - - s = (opcode == expr_ns_add - ? "old-dns-update" - : "old-dns-delete"); - cptr = dmalloc (strlen (s) + 1, MDL); - if (!cptr) - log_fatal ("can't allocate name for %s", s); - strcpy (cptr, s); - if (!expression_allocate (expr, MDL)) - log_fatal ("can't allocate expression"); - (*expr) -> op = expr_funcall; - (*expr) -> data.funcall.name = cptr; - - /* Fake up a function call. */ - ep = &(*expr) -> data.funcall.arglist; - if (!expression_allocate (ep, MDL)) - log_fatal ("can't allocate expression"); - (*ep) -> op = expr_arg; - if (!make_const_int (&(*ep) -> data.arg.val, u)) - log_fatal ("can't allocate rrtype value."); - - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - ep = &((*ep) -> data.arg.next); - if (!expression_allocate (ep, MDL)) - log_fatal ("can't allocate expression"); - (*ep) -> op = expr_arg; - if (!(parse_data_expression (&(*ep) -> data.arg.val, - cfile, lose))) - goto nodata; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - ep = &((*ep) -> data.arg.next); - if (!expression_allocate (ep, MDL)) - log_fatal ("can't allocate expression"); - (*ep) -> op = expr_arg; - if (!(parse_data_expression (&(*ep) -> data.arg.val, - cfile, lose))) - goto nodata; - - if (opcode == expr_ns_add) { - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - ep = &((*ep) -> data.arg.next); - if (!expression_allocate (ep, MDL)) - log_fatal ("can't allocate expression"); - (*ep) -> op = expr_arg; - if (!(parse_numeric_expression (&(*ep) -> data.arg.val, - cfile, lose))) { - parse_warn (cfile, - "expecting numeric expression."); - goto badnsupdate; - } - } - - token = next_token (&val, (unsigned *)0, cfile); - if (token != RPAREN) - goto norparen; - break; - - case NS_UPDATE: -#if !defined (NSUPDATE) - parse_warn (cfile, - "Please rebuild dhcpd with --with-nsupdate."); -#endif - skip_token(&val, (unsigned *)0, cfile); - if (!expression_allocate (expr, MDL)) - log_fatal ("can't allocate expression"); - - token = next_token (&val, (unsigned *)0, cfile); - if (token != LPAREN) - goto nolparen; - - nexp = *expr; - do { - nexp -> op = expr_dns_transaction; - if (!(parse_dns_expression - (&nexp -> data.dns_transaction.car, - cfile, lose))) - { - if (!*lose) - parse_warn - (cfile, - "expecting dns expression."); - expression_dereference (expr, MDL); - *lose = 1; - return 0; - } - - token = next_token (&val, (unsigned *)0, cfile); - - if (token == COMMA) { - if (!(expression_allocate - (&nexp -> data.dns_transaction.cdr, - MDL))) - log_fatal - ("can't allocate expression"); - nexp = nexp -> data.dns_transaction.cdr; - } - } while (token == COMMA); - - if (token != RPAREN) - goto norparen; - break; - - /* NOT EXISTS is special cased above... */ - not_exists: - token = peek_token (&val, (unsigned *)0, cfile); - if (token != EXISTS) { - parse_warn (cfile, "expecting DNS prerequisite."); - *lose = 1; - return 0; - } - opcode = expr_ns_not_exists; - goto nsupdatecode; - case TOKEN_ADD: - opcode = expr_ns_add; - goto nsupdatecode; - case TOKEN_DELETE: - opcode = expr_ns_delete; - goto nsupdatecode; - ns_exists: - opcode = expr_ns_exists; - nsupdatecode: - token = next_token (&val, (unsigned *)0, cfile); - -#if !defined (NSUPDATE) - parse_warn (cfile, - "Please rebuild dhcpd with --with-nsupdate."); -#endif - if (!expression_allocate (expr, MDL)) - log_fatal ("can't allocate expression"); - (*expr) -> op = opcode; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != LPAREN) - goto nolparen; - - token = next_token (&val, (unsigned *)0, cfile); - if (!is_identifier (token) && token != NUMBER) { - parse_warn (cfile, "expecting identifier or number."); - badnsop: - expression_dereference (expr, MDL); - skip_to_semi (cfile); - *lose = 1; - return 0; - } - - if (token == NUMBER) - (*expr) -> data.ns_add.rrclass = atoi (val); - else if (!strcasecmp (val, "in")) - (*expr) -> data.ns_add.rrclass = C_IN; - else if (!strcasecmp (val, "chaos")) - (*expr) -> data.ns_add.rrclass = C_CHAOS; - else if (!strcasecmp (val, "hs")) - (*expr) -> data.ns_add.rrclass = C_HS; - else { - parse_warn (cfile, "unexpected rrclass: %s", val); - goto badnsop; - } - - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - token = next_token (&val, (unsigned *)0, cfile); - if (!is_identifier (token) && token != NUMBER) { - parse_warn (cfile, "expecting identifier or number."); - goto badnsop; - } - - if (token == NUMBER) - (*expr) -> data.ns_add.rrtype = atoi (val); - else if (!strcasecmp (val, "a")) - (*expr) -> data.ns_add.rrtype = T_A; - else if (!strcasecmp (val, "aaaa")) - (*expr) -> data.ns_add.rrtype = T_AAAA; - else if (!strcasecmp (val, "ptr")) - (*expr) -> data.ns_add.rrtype = T_PTR; - else if (!strcasecmp (val, "mx")) - (*expr) -> data.ns_add.rrtype = T_MX; - else if (!strcasecmp (val, "cname")) - (*expr) -> data.ns_add.rrtype = T_CNAME; - else if (!strcasecmp (val, "TXT")) - (*expr) -> data.ns_add.rrtype = T_TXT; - else { - parse_warn (cfile, "unexpected rrtype: %s", val); - goto badnsop; - } - - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - if (!(parse_data_expression - (&(*expr) -> data.ns_add.rrname, cfile, lose))) - goto nodata; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - if (!(parse_data_expression - (&(*expr) -> data.ns_add.rrdata, cfile, lose))) - goto nodata; - - if (opcode == expr_ns_add) { - token = next_token (&val, (unsigned *)0, cfile); - if (token != COMMA) - goto nocomma; - - if (!(parse_numeric_expression - (&(*expr) -> data.ns_add.ttl, cfile, - lose))) { - if (!*lose) - parse_warn (cfile, - "expecting numeric expression."); - goto badnsupdate; - } - } - - token = next_token (&val, (unsigned *)0, cfile); - if (token != RPAREN) - goto norparen; - break; -#endif /* NSUPDATE_OLD */ case OPTION: case CONFIG_OPTION: if (!expression_allocate (expr, MDL)) @@ -4322,43 +3993,6 @@ int parse_non_binary (expr, cfile, lose, context) (*expr) -> op = expr_host_decl_name; break; -#if defined(NSUPDATE_OLD) - case UPDATED_DNS_RR: - skip_token(&val, (unsigned *)0, cfile); - token = next_token (&val, (unsigned *)0, cfile); - if (token != LPAREN) - goto nolparen; - - token = next_token (&val, (unsigned *)0, cfile); - if (token != STRING) { - parse_warn (cfile, "expecting string."); - bad_rrtype: - *lose = 1; - return 0; - } - if (!strcasecmp (val, "a")) - s = "ddns-fwd-name"; - else if (!strcasecmp (val, "ptr")) - s = "ddns-rev-name"; - else { - parse_warn (cfile, "invalid DNS rrtype: %s", val); - goto bad_rrtype; - } - - token = next_token (&val, (unsigned *)0, cfile); - if (token != RPAREN) - goto norparen; - - if (!expression_allocate (expr, MDL)) - log_fatal ("can't allocate expression"); - (*expr) -> op = expr_variable_reference; - (*expr) -> data.variable = - dmalloc (strlen (s) + 1, MDL); - if (!(*expr) -> data.variable) - log_fatal ("can't allocate variable name."); - strcpy ((*expr) -> data.variable, s); - break; -#endif /* NSUPDATE_OLD */ case PACKET: skip_token(&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) |