summaryrefslogtreecommitdiff
path: root/common/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/parse.c')
-rw-r--r--common/parse.c111
1 files changed, 71 insertions, 40 deletions
diff --git a/common/parse.c b/common/parse.c
index 9c8e5dbe..b840541b 100644
--- a/common/parse.c
+++ b/common/parse.c
@@ -43,7 +43,7 @@
#ifndef lint
static char copyright[] =
-"$Id: parse.c,v 1.104 2001/05/02 16:59:30 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n";
+"$Id: parse.c,v 1.105 2001/06/27 00:29:56 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n";
#endif /* not lint */
#include "dhcpd.h"
@@ -295,7 +295,7 @@ int parse_ip_addr_or_hostname (expr, cfile, uniform)
} else if (token == NUMBER) {
if (!parse_numeric_aggregate (cfile, addr, &len, DOT, 10, 8))
return 0;
- return make_const_data (expr, addr, len, 0, 1);
+ return make_const_data (expr, addr, len, 0, 1, MDL);
} else {
if (token != RBRACE && token != LBRACE)
token = next_token (&val, (unsigned *)0, cfile);
@@ -975,7 +975,7 @@ void parse_option_space_decl (cfile)
universes = ua;
}
universes [nu -> index] = nu;
- nu -> hash = new_hash (0, 0, 1);
+ nu -> hash = new_hash (0, 0, 1, MDL);
if (!nu -> hash)
log_fatal ("Can't allocate %s option hash table.", nu -> name);
universe_hash_add (universe_hash, nu -> name, 0, nu, MDL);
@@ -1152,6 +1152,9 @@ int parse_option_code_definition (cfile, option)
case IP_ADDRESS:
type = 'I';
break;
+ case DOMAIN_NAME:
+ type = 'd';
+ goto no_arrays;
case TEXT:
type = 't';
no_arrays:
@@ -1292,7 +1295,7 @@ int parse_base64 (data, cfile)
from64 [] = {64, 64, 64, 64, 64, 64, 64, 64, /* \"#$%&' */
64, 64, 64, 62, 64, 64, 64, 63, /* ()*+,-./ */
52, 53, 54, 55, 56, 57, 58, 59, /* 01234567 */
- 60, 61, 64, 64, 64, 64, 64, 64, /* 90:;<=>? */
+ 60, 61, 64, 64, 64, 64, 64, 64, /* 89:;<=>? */
64, 0, 1, 2, 3, 4, 5, 6, /* @ABCDEFG */
7, 8, 9, 10, 11, 12, 13, 14, /* HIJKLMNO */
15, 16, 17, 18, 19, 20, 21, 22, /* PQRSTUVW */
@@ -1522,6 +1525,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
int i;
struct dns_zone *zone;
isc_result_t status;
+ char *s;
token = peek_token (&val, (unsigned *)0, cfile);
switch (token) {
@@ -1954,9 +1958,14 @@ int parse_executable_statement (result, cfile, lose, case_context)
}
i = strlen (zone -> name);
if (zone -> name [i - 1] != '.') {
- parse_warn (cfile,
- "zone name must not be relative %s: %s",
- "(must end in '.')", zone -> name);
+ s = dmalloc ((unsigned)i + 2, MDL);
+ if (!s)
+ goto badzone;
+ strcpy (s, zone -> name);
+ s [i] = '.';
+ s [i + 1] = 0;
+ dfree (zone -> name, MDL);
+ zone -> name = s;
}
if (!parse_zone (zone, cfile))
goto badzone;
@@ -1969,6 +1978,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
dns_zone_dereference (&zone, MDL);
return 0;
}
+ dns_zone_dereference (&zone, MDL);
return 1;
/* Also not really a statement, but same idea as above. */
@@ -2287,6 +2297,7 @@ int parse_key (struct parse *cfile)
key -> name, isc_result_totext (status));
goto bad;
}
+ omapi_auth_key_dereference (&key, MDL);
return 1;
rbad:
@@ -2548,7 +2559,7 @@ int parse_if_statement (result, cfile, lose)
executable_statement_dereference (result, MDL);
return 0;
}
- if (!parse_executable_statements (&(*result) -> data.ie.true,
+ if (!parse_executable_statements (&(*result) -> data.ie.tc,
cfile, lose, context_any)) {
if (*lose) {
/* Try to even things up. */
@@ -2574,7 +2585,7 @@ int parse_if_statement (result, cfile, lose)
token = peek_token (&val, (unsigned *)0, cfile);
if (token == IF) {
token = next_token (&val, (unsigned *)0, cfile);
- if (!parse_if_statement (&(*result) -> data.ie.false,
+ if (!parse_if_statement (&(*result) -> data.ie.fc,
cfile, lose)) {
if (!*lose)
parse_warn (cfile,
@@ -2592,7 +2603,7 @@ int parse_if_statement (result, cfile, lose)
} else {
token = next_token (&val, (unsigned *)0, cfile);
if (!(parse_executable_statements
- (&(*result) -> data.ie.false,
+ (&(*result) -> data.ie.fc,
cfile, lose, context_any))) {
executable_statement_dereference (result, MDL);
return 0;
@@ -2608,7 +2619,7 @@ int parse_if_statement (result, cfile, lose)
}
} else if (token == ELSIF) {
token = next_token (&val, (unsigned *)0, cfile);
- if (!parse_if_statement (&(*result) -> data.ie.false,
+ if (!parse_if_statement (&(*result) -> data.ie.fc,
cfile, lose)) {
if (!*lose)
parse_warn (cfile,
@@ -2618,7 +2629,7 @@ int parse_if_statement (result, cfile, lose)
return 0;
}
} else
- (*result) -> data.ie.false = (struct executable_statement *)0;
+ (*result) -> data.ie.fc = (struct executable_statement *)0;
return 1;
}
@@ -3008,6 +3019,7 @@ int parse_non_binary (expr, cfile, lose, context)
*expr, MDL);
expression_dereference (expr, MDL);
expression_reference (expr, nexp, MDL);
+ expression_dereference (&nexp, MDL);
goto concat_another;
}
@@ -3096,23 +3108,28 @@ int parse_non_binary (expr, cfile, lose, context)
if (token != LPAREN)
goto nolparen;
- nexp = *expr;
+ nexp = (struct expression *)0;
+ expression_reference (&nexp, *expr, MDL);
do {
- nexp -> op = expr_pick_first_value;
- if (!(parse_data_expression
- (&nexp -> data.pick_first_value.car,
- cfile, lose)))
- goto nodata;
+ nexp -> op = expr_pick_first_value;
+ if (!(parse_data_expression
+ (&nexp -> data.pick_first_value.car,
+ cfile, lose)))
+ goto nodata;
- token = next_token (&val, (unsigned *)0, cfile);
- if (token == COMMA) {
- if (!(expression_allocate
- (&nexp -> data.pick_first_value.cdr,
- MDL)))
- log_fatal ("can't allocate expr");
- nexp = nexp -> data.pick_first_value.cdr;
- }
+ token = next_token (&val, (unsigned *)0, cfile);
+ if (token == COMMA) {
+ struct expression *foo = (struct expression *)0;
+ if (!expression_allocate (&foo, MDL))
+ log_fatal ("can't allocate expr");
+ expression_reference
+ (&nexp -> data.pick_first_value.cdr, foo, MDL);
+ expression_dereference (&nexp, MDL);
+ expression_reference (&nexp, foo, MDL);
+ expression_dereference (&foo, MDL);
+ }
} while (token == COMMA);
+ expression_dereference (&nexp, MDL);
if (token != RPAREN)
goto norparen;
@@ -3533,7 +3550,7 @@ int parse_non_binary (expr, cfile, lose, context)
case STRING:
token = next_token (&val, &len, cfile);
if (!make_const_data (expr, (const unsigned char *)val,
- len, 1, 1))
+ len, 1, 1, MDL))
log_fatal ("can't make constant string expression.");
break;
@@ -4220,8 +4237,10 @@ int parse_option_statement (result, cfile, lookups, option, op)
log_fatal ("no memory for option statement.");
(*result) -> op = op;
if (expr && !option_cache (&(*result) -> data.option,
- (struct data_string *)0, expr, option))
+ (struct data_string *)0, expr, option, MDL))
log_fatal ("no memory for option cache");
+ if (expr)
+ expression_dereference (&expr, MDL);
return 1;
}
@@ -4256,7 +4275,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
}
token = next_token (&val, &len, cfile);
if (!make_const_data (&t, (const unsigned char *)val,
- len, 1, 1))
+ len, 1, 1, MDL))
log_fatal ("No memory for %s", val);
break;
@@ -4282,7 +4301,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
} else if (token == STRING) {
token = next_token (&val, &len, cfile);
if (!make_const_data (&t, (const unsigned char *)val,
- len, 1, 1))
+ len, 1, 1, MDL))
log_fatal ("No memory for \"%s\"", val);
} else {
if ((*fmt) [1] != 'o') {
@@ -4294,6 +4313,16 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
}
break;
+ case 'd': /* Domain name... */
+ val = parse_host_name (cfile);
+ if (!val) {
+ parse_warn (cfile, "not a valid domain name.");
+ skip_to_semi (cfile);
+ return 0;
+ }
+ len = strlen (val);
+ goto make_string;
+
case 't': /* Text string... */
token = peek_token (&val, (unsigned *)0, cfile);
if (token != STRING && !is_identifier (token)) {
@@ -4305,8 +4334,9 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
return 0;
}
token = next_token (&val, &len, cfile);
+ make_string:
if (!make_const_data (&t, (const unsigned char *)val,
- len, 1, 1))
+ len, 1, 1, MDL))
log_fatal ("No memory for concatenation");
break;
@@ -4332,7 +4362,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
parse_warn (cfile, "unknown value");
goto foo;
}
- if (!make_const_data (&t, &e -> value, 1, 0, 1))
+ if (!make_const_data (&t, &e -> value, 1, 0, 1, MDL))
return 0;
break;
@@ -4343,7 +4373,8 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
} else {
if (!parse_ip_addr (cfile, &addr))
return 0;
- if (!make_const_data (&t, addr.iabuf, addr.len, 0, 1))
+ if (!make_const_data (&t, addr.iabuf, addr.len,
+ 0, 1, MDL))
return 0;
}
break;
@@ -4354,7 +4385,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
goto check_number;
token = next_token (&val, (unsigned *)0, cfile);
putLong (buf, -1);
- if (!make_const_data (&t, buf, 4, 0, 1))
+ if (!make_const_data (&t, buf, 4, 0, 1, MDL))
return 0;
break;
@@ -4373,7 +4404,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
}
token = next_token (&val, (unsigned *)0, cfile);
convert_num (cfile, buf, val, 0, 32);
- if (!make_const_data (&t, buf, 4, 0, 1))
+ if (!make_const_data (&t, buf, 4, 0, 1, MDL))
return 0;
break;
@@ -4384,7 +4415,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
goto need_number;
token = next_token (&val, (unsigned *)0, cfile);
convert_num (cfile, buf, val, 0, 16);
- if (!make_const_data (&t, buf, 2, 0, 1))
+ if (!make_const_data (&t, buf, 2, 0, 1, MDL))
return 0;
break;
@@ -4395,7 +4426,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
goto need_number;
token = next_token (&val, (unsigned *)0, cfile);
convert_num (cfile, buf, val, 0, 8);
- if (!make_const_data (&t, buf, 1, 0, 1))
+ if (!make_const_data (&t, buf, 1, 0, 1, MDL))
return 0;
break;
@@ -4425,7 +4456,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
goto bad_flag;
}
token = next_token (&val, (unsigned *)0, cfile);
- if (!make_const_data (&t, buf, 1, 0, 1))
+ if (!make_const_data (&t, buf, 1, 0, 1, MDL))
return 0;
break;
@@ -4438,9 +4469,9 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
if (expr) {
if (!make_concat (rv, expr, t))
return 0;
- expression_dereference (&t, MDL);
} else
- *rv = t;
+ expression_reference (rv, t, MDL);
+ expression_dereference (&t, MDL);
return 1;
}