From: Ted Lemon Date: Sat, 17 Mar 2001 00:47:39 +0000 (+0000) Subject: Support NUL characters in STRING tokens. X-Git-Tag: V3-BETA-2-PATCH-20~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b3519f23f1ed8a6700120425a63f7c5ed256812e;p=thirdparty%2Fdhcp.git Support NUL characters in STRING tokens. --- diff --git a/client/clparse.c b/client/clparse.c index 0cde199e2..99d260cf0 100644 --- a/client/clparse.c +++ b/client/clparse.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: clparse.c,v 1.57 2001/03/01 18:16:57 mellon Exp $ Copyright (c) 1996-2001 The Internet Software Consortium. All rights reserved.\n"; +"$Id: clparse.c,v 1.58 2001/03/17 00:47:30 mellon Exp $ Copyright (c) 1996-2001 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -113,14 +113,14 @@ isc_result_t read_client_conf () new_parse (&cfile, file, (char *)0, 0, path_dhclient_conf); do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) break; parse_client_statement (cfile, (struct interface_info *)0, &top_level_config); } while (1); - token = next_token (&val, cfile); /* Clear the peek buffer */ + token = next_token (&val, (unsigned *)0, cfile); /* Clear the peek buffer */ status = (cfile -> warnings_occurred ? ISC_R_BADPARSE : ISC_R_SUCCESS); @@ -176,7 +176,7 @@ void read_client_leases () new_parse (&cfile, file, (char *)0, 0, path_dhclient_db); do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) break; if (token != LEASE) { @@ -229,9 +229,9 @@ void parse_client_statement (cfile, ip, config) int known; int tmp, i; - switch (peek_token (&val, cfile)) { + switch (peek_token (&val, (unsigned *)0, cfile)) { case KEY: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (ip) { /* This may seem arbitrary, but there's a reason for doing it: the authentication key database is not @@ -255,8 +255,8 @@ void parse_client_statement (cfile, ip, config) /* REQUIRE can either start a policy statement or a comma-seperated list of names of required options. */ case REQUIRE: - next_token (&val, cfile); - token = peek_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == AUTHENTICATION) { policy = P_REQUIRE; goto do_policy; @@ -265,27 +265,27 @@ void parse_client_statement (cfile, ip, config) return; case IGNORE: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); policy = P_IGNORE; goto do_policy; case ACCEPT: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); policy = P_ACCEPT; goto do_policy; case PREFER: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); policy = P_PREFER; goto do_policy; case DONT: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); policy = P_DONT; goto do_policy; do_policy: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == AUTHENTICATION) { if (policy != P_PREFER && policy != P_REQUIRE && @@ -313,9 +313,9 @@ void parse_client_statement (cfile, ip, config) break; case OPTION: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SPACE) { if (ip) { parse_warn (cfile, @@ -332,7 +332,7 @@ void parse_client_statement (cfile, ip, config) if (!option) return; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != CODE) { parse_warn (cfile, "expecting \"code\" keyword."); skip_to_semi (cfile); @@ -352,12 +352,12 @@ void parse_client_statement (cfile, ip, config) return; case MEDIA: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_string_list (cfile, &config -> media, 1); return; case HARDWARE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (ip) { parse_hardware_param (cfile, &ip -> hw_address); } else { @@ -368,36 +368,36 @@ void parse_client_statement (cfile, ip, config) return; case REQUEST: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (config -> requested_options == default_requested_options) config -> requested_options = (u_int32_t *)0; parse_option_list (cfile, &config -> requested_options); return; case TIMEOUT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> timeout); return; case RETRY: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> retry_interval); return; case SELECT_TIMEOUT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> select_interval); return; case OMAPI: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != PORT) { parse_warn (cfile, "unexpected omapi subtype: %s", val); skip_to_semi (cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "invalid port number: `%s'", val); skip_to_semi (cfile); @@ -415,40 +415,40 @@ void parse_client_statement (cfile, ip, config) return; case REBOOT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> reboot_timeout); return; case BACKOFF_CUTOFF: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> backoff_cutoff); return; case INITIAL_INTERVAL: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_lease_time (cfile, &config -> initial_interval); return; case SCRIPT: - token = next_token (&val, cfile); - config -> script_name = parse_string (cfile); + token = next_token (&val, (unsigned *)0, cfile); + parse_string (cfile, &config -> script_name, (unsigned *)0); return; case VENDOR: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != OPTION) { parse_warn (cfile, "expecting 'vendor option space'"); skip_to_semi (cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SPACE) { parse_warn (cfile, "expecting 'vendor option space'"); skip_to_semi (cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting an identifier."); skip_to_semi (cfile); @@ -470,15 +470,15 @@ void parse_client_statement (cfile, ip, config) return; case INTERFACE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (ip) parse_warn (cfile, "nested interface declaration."); parse_interface_declaration (cfile, config, (char *)0); return; case PSEUDO: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); name = dmalloc (strlen (val) + 1, MDL); if (!name) log_fatal ("no memory for pseudo interface name"); @@ -487,17 +487,17 @@ void parse_client_statement (cfile, ip, config) return; case LEASE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_client_lease_statement (cfile, 1); return; case ALIAS: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_client_lease_statement (cfile, 2); return; case REJECT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_reject_statement (cfile, config); return; @@ -556,7 +556,7 @@ void parse_option_list (cfile, list) ix = 0; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == SEMI) break; if (!is_identifier (token)) { @@ -584,7 +584,7 @@ void parse_option_list (cfile, list) p = r; q = r; ++ix; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == COMMA); if (token != SEMI) { parse_warn (cfile, "expecting semicolon."); @@ -625,7 +625,7 @@ void parse_interface_declaration (cfile, outer_config, name) struct client_state *client, **cp; struct interface_info *ip = (struct interface_info *)0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting interface name (in quotes)."); skip_to_semi (cfile); @@ -657,7 +657,7 @@ void parse_interface_declaration (cfile, outer_config, name) ip -> flags &= ~INTERFACE_AUTOMATIC; interfaces_requested = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace."); skip_to_semi (cfile); @@ -665,7 +665,7 @@ void parse_interface_declaration (cfile, outer_config, name) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) { parse_warn (cfile, "unterminated interface declaration."); @@ -675,7 +675,7 @@ void parse_interface_declaration (cfile, outer_config, name) break; parse_client_statement (cfile, ip, client -> config); } while (1); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } int interface_or_dummy (struct interface_info **pi, const char *name) @@ -770,7 +770,7 @@ void parse_client_lease_statement (cfile, is_static) const char *val; struct client_state *client = (struct client_state *)0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace."); skip_to_semi (cfile); @@ -787,7 +787,7 @@ void parse_client_lease_statement (cfile, is_static) log_fatal ("no memory for lease options.\n"); do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) { parse_warn (cfile, "unterminated lease declaration."); return; @@ -796,7 +796,7 @@ void parse_client_lease_statement (cfile, is_static) break; parse_client_lease_declaration (cfile, lease, &ip, &client); } while (1); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* If the lease declaration didn't include an interface declaration that we recognized, it's of no use to us. */ @@ -901,9 +901,9 @@ void parse_client_lease_declaration (cfile, lease, ipp, clientp) struct client_state *client = (struct client_state *)0; struct data_string key_id; - switch (next_token (&val, cfile)) { + switch (next_token (&val, (unsigned *)0, cfile)) { case KEY: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING && !is_identifier (token)) { parse_warn (cfile, "expecting key name."); skip_to_semi (cfile); @@ -919,7 +919,7 @@ void parse_client_lease_declaration (cfile, lease, ipp, clientp) break; case INTERFACE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting interface name (in quotes)."); @@ -930,7 +930,7 @@ void parse_client_lease_declaration (cfile, lease, ipp, clientp) break; case NAME: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); ip = *ipp; if (!ip) { parse_warn (cfile, "state name precedes interface."); @@ -955,11 +955,11 @@ void parse_client_lease_declaration (cfile, lease, ipp, clientp) return; case FILENAME: - lease -> filename = parse_string (cfile); + parse_string (cfile, &lease -> filename, (unsigned *)0); return; case SERVER_NAME: - lease -> server_name = parse_string (cfile); + parse_string (cfile, &lease -> server_name, (unsigned *)0); return; case RENEW: @@ -988,7 +988,7 @@ void parse_client_lease_declaration (cfile, lease, ipp, clientp) skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SEMI) { parse_warn (cfile, "expecting semicolon."); skip_to_semi (cfile); @@ -1013,7 +1013,7 @@ void parse_string_list (cfile, lp, multiple) } do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "Expecting media options."); skip_to_semi (cfile); @@ -1036,7 +1036,7 @@ void parse_string_list (cfile, lp, multiple) *lp = tmp; cur = tmp; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (multiple && token == COMMA); if (token != SEMI) { @@ -1070,7 +1070,7 @@ void parse_reject_statement (cfile, config) list -> next = config -> reject_list; config -> reject_list = list; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == COMMA); if (token != SEMI) { diff --git a/common/conflex.c b/common/conflex.c index 51b06c102..26ca7462d 100644 --- a/common/conflex.c +++ b/common/conflex.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: conflex.c,v 1.89 2001/03/01 18:16:59 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; +"$Id: conflex.c,v 1.90 2001/03/17 00:47:32 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -210,6 +210,7 @@ static enum dhcp_token get_token (cfile) break; } else if (c == EOF) { ttok = END_OF_FILE; + cfile -> tlen = 0; break; } else { cfile -> lexline = l; @@ -217,6 +218,7 @@ static enum dhcp_token get_token (cfile) tb [0] = c; tb [1] = 0; cfile -> tval = tb; + cfile -> tlen = 1; ttok = c; break; } @@ -224,8 +226,9 @@ static enum dhcp_token get_token (cfile) return ttok; } -enum dhcp_token next_token (rval, cfile) +enum dhcp_token next_token (rval, rlen, cfile) const char **rval; + unsigned *rlen; struct parse *cfile; { int rv; @@ -243,14 +246,17 @@ enum dhcp_token next_token (rval, cfile) } if (rval) *rval = cfile -> tval; + if (rlen) + *rlen = cfile -> tlen; #ifdef DEBUG_TOKENS fprintf (stderr, "%s:%d ", cfile -> tval, rv); #endif return rv; } -enum dhcp_token peek_token (rval, cfile) +enum dhcp_token peek_token (rval, rlen, cfile) const char **rval; + unsigned int *rlen; struct parse *cfile; { int x; @@ -272,6 +278,8 @@ enum dhcp_token peek_token (rval, cfile) } if (rval) *rval = cfile -> tval; + if (rlen) + *rlen = cfile -> tlen; #ifdef DEBUG_TOKENS fprintf (stderr, "(%s:%d) ", cfile -> tval, cfile -> token); #endif @@ -400,6 +408,7 @@ static enum dhcp_token read_string (cfile) --i; } cfile -> tokbuf [i] = 0; + cfile -> tlen = i; cfile -> tval = cfile -> tokbuf; return STRING; } @@ -437,6 +446,7 @@ static enum dhcp_token read_number (c, cfile) --i; } cfile -> tokbuf [i] = 0; + cfile -> tlen = i; cfile -> tval = cfile -> tokbuf; return token; } @@ -465,6 +475,7 @@ static enum dhcp_token read_num_or_name (c, cfile) --i; } cfile -> tokbuf [i] = 0; + cfile -> tlen = i; cfile -> tval = cfile -> tokbuf; return intern (cfile -> tval, rv); } diff --git a/common/parse.c b/common/parse.c index b3909e9c6..0ba577b8e 100644 --- a/common/parse.c +++ b/common/parse.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: parse.c,v 1.101 2001/03/01 18:17:00 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; +"$Id: parse.c,v 1.102 2001/03/17 00:47:33 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -118,9 +118,9 @@ void skip_to_rbrace (cfile, brace_count) log_error ("skip_to_rbrace: %d\n", brace_count); #endif do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (brace_count) { if (!--brace_count) return; @@ -129,16 +129,16 @@ void skip_to_rbrace (cfile, brace_count) } else if (token == LBRACE) { brace_count++; } else if (token == SEMI && !brace_count) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); return; } else if (token == EOL) { /* EOL only happens when parsing /etc/resolv.conf, and we treat it like a semicolon because the resolv.conf file is line-oriented. */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token != END_OF_FILE); } @@ -148,7 +148,7 @@ int parse_semi (cfile) enum dhcp_token token; const char *val; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SEMI) { parse_warn (cfile, "semicolon expected."); skip_to_semi (cfile); @@ -159,27 +159,38 @@ int parse_semi (cfile) /* string-parameter :== STRING SEMI */ -char *parse_string (cfile) +int parse_string (cfile, sptr, lptr) struct parse *cfile; + char **sptr; + unsigned *lptr; { const char *val; enum dhcp_token token; char *s; + unsigned len; - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); if (token != STRING) { parse_warn (cfile, "expecting a string"); skip_to_semi (cfile); - return (char *)0; + return 0; } - s = (char *)dmalloc (strlen (val) + 1, MDL); + s = (char *)dmalloc (len + 1, MDL); if (!s) log_fatal ("no memory for string %s.", val); - strcpy (s, val); + memcpy (s, val, len + 1); - if (!parse_semi (cfile)) - return (char *)0; - return s; + if (!parse_semi (cfile)) { + dfree (s, MDL); + return 0; + } + if (sptr) + *sptr = s; + else + dfree (s, MDL); + if (lptr) + *lptr = len; + return 1; } /* @@ -202,10 +213,10 @@ char *parse_host_name (cfile) /* Read a dotted hostname... */ do { /* Read a token, which should be an identifier. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (!is_identifier (token) && token != NUMBER) break; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* Store this identifier... */ if (!(s = (char *)dmalloc (strlen (val) + 1, MDL))) @@ -215,9 +226,9 @@ char *parse_host_name (cfile) len += strlen (s) + 1; /* Look for a dot; if it's there, keep going, otherwise we're done. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == DOT) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); ltid = 1; } else ltid = 0; @@ -268,7 +279,7 @@ int parse_ip_addr_or_hostname (expr, cfile, uniform) char *name; struct expression *x = (struct expression *)0; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (is_identifier (token)) { name = parse_host_name (cfile); if (!name) @@ -287,7 +298,7 @@ int parse_ip_addr_or_hostname (expr, cfile, uniform) return make_const_data (expr, addr, len, 0, 1); } else { if (token != RBRACE && token != LBRACE) - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "%s (%d): expecting IP address or hostname", val, token); if (token != SEMI) @@ -330,7 +341,7 @@ void parse_hardware_param (cfile, hardware) unsigned hlen; unsigned char *t; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case ETHERNET: hardware -> hbuf [0] = HTYPE_ETHER; @@ -361,7 +372,7 @@ void parse_hardware_param (cfile, hardware) that data in the lease file rather than simply failing on such clients. Yuck. */ hlen = 0; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) { hardware -> hlen = 1; goto out; @@ -385,7 +396,7 @@ void parse_hardware_param (cfile, hardware) } out: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SEMI) { parse_warn (cfile, "expecting semicolon."); skip_to_semi (cfile); @@ -401,7 +412,7 @@ void parse_lease_time (cfile, timep) const char *val; enum dhcp_token token; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "Expecting numeric lease time"); skip_to_semi (cfile); @@ -446,20 +457,22 @@ unsigned char *parse_numeric_aggregate (cfile, buf, do { if (count) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != seperator) { if (!*max) break; if (token != RBRACE && token != LBRACE) - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, + cfile); parse_warn (cfile, "too few numbers."); if (token != SEMI) skip_to_semi (cfile); return (unsigned char *)0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) { parse_warn (cfile, "unexpected end of file"); @@ -651,7 +664,7 @@ TIME parse_date (cfile) 212, 243, 273, 304, 334 }; /* Day of week, or "never"... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == NEVER) { if (!parse_semi (cfile)) return 0; @@ -667,7 +680,7 @@ TIME parse_date (cfile) wday = atoi (val); /* Year... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric year expected."); if (token != SEMI) @@ -684,7 +697,7 @@ TIME parse_date (cfile) year -= 1900; /* Slash seperating year from month... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SLASH) { parse_warn (cfile, "expected slash seperating year from month."); @@ -694,7 +707,7 @@ TIME parse_date (cfile) } /* Month... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric month expected."); if (token != SEMI) @@ -704,7 +717,7 @@ TIME parse_date (cfile) mon = atoi (val) - 1; /* Slash seperating month from day... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SLASH) { parse_warn (cfile, "expected slash seperating month from day."); @@ -714,7 +727,7 @@ TIME parse_date (cfile) } /* Month... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric day of month expected."); if (token != SEMI) @@ -724,7 +737,7 @@ TIME parse_date (cfile) mday = atoi (val); /* Hour... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric hour expected."); if (token != SEMI) @@ -734,7 +747,7 @@ TIME parse_date (cfile) hour = atoi (val); /* Colon seperating hour from minute... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COLON) { parse_warn (cfile, "expected colon seperating hour from minute."); @@ -744,7 +757,7 @@ TIME parse_date (cfile) } /* Minute... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric minute expected."); if (token != SEMI) @@ -754,7 +767,7 @@ TIME parse_date (cfile) min = atoi (val); /* Colon seperating minute from second... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COLON) { parse_warn (cfile, "expected colon seperating hour from minute."); @@ -764,7 +777,7 @@ TIME parse_date (cfile) } /* Minute... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "numeric minute expected."); if (token != SEMI) @@ -773,9 +786,9 @@ TIME parse_date (cfile) } sec = atoi (val); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == NUMBER) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); tzoff = atoi (val); } else tzoff = 0; @@ -824,7 +837,7 @@ struct option *parse_option_name (cfile, allocate, known) struct universe *universe; struct option *option; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting identifier after option keyword."); @@ -836,13 +849,13 @@ struct option *parse_option_name (cfile, allocate, known) if (!uname) log_fatal ("no memory for uname information."); strcpy (uname, val); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == DOT) { /* Go ahead and take the DOT token... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* The next token should be an identifier... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting identifier after '.'"); if (token != SEMI) @@ -920,9 +933,10 @@ void parse_option_space_decl (cfile) struct universe **ua, *nu; char *s; - next_token (&val, cfile); /* Discard the SPACE token, which was - checked by the caller. */ - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); /* Discard the SPACE token, + which was checked by the + caller. */ + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting identifier."); skip_to_semi (cfile); @@ -1019,7 +1033,7 @@ int parse_option_code_definition (cfile, option) int has_encapsulation = 0; /* Parse the option code. */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting option code number."); skip_to_semi (cfile); @@ -1027,7 +1041,7 @@ int parse_option_code_definition (cfile, option) } option -> code = atoi (val); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != EQUAL) { parse_warn (cfile, "expecting \"=\""); skip_to_semi (cfile); @@ -1035,21 +1049,21 @@ int parse_option_code_definition (cfile, option) } /* See if this is an array. */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == ARRAY) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != OF) { parse_warn (cfile, "expecting \"of\"."); skip_to_semi (cfile); return 0; } arrayp = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } if (token == LBRACE) { recordp = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } /* At this point we're expecting a data type. */ @@ -1070,14 +1084,14 @@ int parse_option_code_definition (cfile, option) skip_to_semi (cfile); return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != OF) { parse_warn (cfile, "expecting \"of\"."); skip_to_semi (cfile); return 0; } arrayp = recordp + 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if ((recordp) && (token == LBRACE)) { parse_warn (cfile, "only uniform array inside record."); @@ -1092,7 +1106,7 @@ int parse_option_code_definition (cfile, option) case INTEGER: is_signed = 1; parse_integer: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting number."); skip_to_rbrace (cfile, recordp); @@ -1122,7 +1136,7 @@ int parse_option_code_definition (cfile, option) case SIGNED: is_signed = 1; parse_signed: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != INTEGER) { parse_warn (cfile, "expecting \"integer\" keyword."); skip_to_rbrace (cfile, recordp); @@ -1156,7 +1170,7 @@ int parse_option_code_definition (cfile, option) goto no_arrays; case ENCAPSULATE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting option space identifier"); @@ -1191,7 +1205,7 @@ int parse_option_code_definition (cfile, option) tokbuf [tokix++] = type; if (recordp) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (arrayp > recordp) { if (tokix == sizeof tokbuf) { parse_warn (cfile, @@ -1213,7 +1227,7 @@ int parse_option_code_definition (cfile, option) skip_to_semi (cfile); return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); goto next_type; } if (token != RBRACE) { @@ -1297,22 +1311,21 @@ int parse_base64 (data, cfile) tokenized into more than one token, so we have to parse them all in before decoding. */ do { - int l; + unsigned l; - token = next_token (&val, cfile); - l = strlen (val); + token = next_token (&val, &l, cfile); t = dmalloc (l + sizeof *t, MDL); if (!t) log_fatal ("no memory for base64 buffer."); memset (t, 0, (sizeof *t) - 1); - strcpy (t -> string, val); + memcpy (t -> string, val, l + 1); cc += l; if (last) last -> next = t; else bufs = t; last = t; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); } while (token == NUMBER_OR_NAME || token == NAME || token == EQUAL || token == NUMBER || token == PLUS || token == SLASH || token == STRING); @@ -1413,7 +1426,7 @@ int parse_cshl (data, cfile) unsigned char *rvp; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER && token != NUMBER_OR_NAME) { parse_warn (cfile, "expecting hexadecimal number."); skip_to_semi (cfile); @@ -1437,10 +1450,10 @@ int parse_cshl (data, cfile) } convert_num (cfile, &ibuf [ilen++], val, 16, 8); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != COLON) break; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (1); if (!buffer_allocate (&data -> buffer, tlen + ilen, MDL)) @@ -1510,15 +1523,15 @@ int parse_executable_statement (result, cfile, lose, case_context) struct dns_zone *zone; isc_result_t status; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); switch (token) { case IF: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); return parse_if_statement (result, cfile, lose); case TOKEN_ADD: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting class name."); skip_to_semi (cfile); @@ -1545,7 +1558,7 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case BREAK: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_semi (cfile)) { *lose = 1; return 0; @@ -1556,7 +1569,7 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case SEND: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); known = 0; option = parse_option_name (cfile, 0, &known); if (!option) { @@ -1568,7 +1581,7 @@ int parse_executable_statement (result, cfile, lose, case_context) case SUPERSEDE: case OPTION: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); known = 0; option = parse_option_name (cfile, 0, &known); if (!option) { @@ -1587,7 +1600,7 @@ int parse_executable_statement (result, cfile, lose, case_context) case IGNORE: flag = 2; pad: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); cache = (struct option_cache *)0; if (!parse_allow_deny (&cache, cfile, flag)) return 0; @@ -1598,8 +1611,8 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case DEFAULT: - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == COLON) goto switch_default; known = 0; @@ -1612,7 +1625,7 @@ int parse_executable_statement (result, cfile, lose, case_context) default_option_statement); case PREPEND: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); known = 0; option = parse_option_name (cfile, 0, &known); if (!option) { @@ -1623,7 +1636,7 @@ int parse_executable_statement (result, cfile, lose, case_context) prepend_option_statement); case APPEND: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); known = 0; option = parse_option_name (cfile, 0, &known); if (!option) { @@ -1634,15 +1647,15 @@ int parse_executable_statement (result, cfile, lose, case_context) append_option_statement); case ON: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); return parse_on_statement (result, cfile, lose); case SWITCH: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); return parse_switch_statement (result, cfile, lose); case CASE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (case_context == context_any) { parse_warn (cfile, "case statement in inappropriate scope."); @@ -1654,7 +1667,7 @@ int parse_executable_statement (result, cfile, lose, case_context) cfile, lose, case_context); switch_default: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (case_context == context_any) { parse_warn (cfile, "switch default statement in %s", "inappropriate scope."); @@ -1670,13 +1683,13 @@ int parse_executable_statement (result, cfile, lose, case_context) case DEFINE: case TOKEN_SET: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == DEFINE) flag = 1; else flag = 0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NAME && token != NUMBER_OR_NAME) { parse_warn (cfile, "%s can't be a variable name", val); @@ -1693,14 +1706,15 @@ int parse_executable_statement (result, cfile, lose, case_context) if (!(*result)->data.set.name) log_fatal ("can't allocate variable name"); strcpy ((*result) -> data.set.name, val); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == LPAREN) { struct string_list *head, *cur, *new; struct expression *expr; head = cur = (struct string_list *)0; do { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (token == RPAREN) break; if (token != NAME && token != NUMBER_OR_NAME) { @@ -1725,7 +1739,8 @@ int parse_executable_statement (result, cfile, lose, case_context) } else { head = cur = new; } - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); } while (token == COMMA); if (token != RPAREN) { @@ -1737,7 +1752,7 @@ int parse_executable_statement (result, cfile, lose, case_context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace."); goto badx; @@ -1759,7 +1774,7 @@ int parse_executable_statement (result, cfile, lose, case_context) goto badx; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "expecting rigt brace."); goto badx; @@ -1790,9 +1805,9 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case UNSET: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NAME && token != NUMBER_OR_NAME) { parse_warn (cfile, "%s can't be a variable name", val); @@ -1813,7 +1828,7 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case EVAL: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!executable_statement_allocate (result, MDL)) log_fatal ("no memory for eval statement."); @@ -1835,7 +1850,7 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case RETURN: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!executable_statement_allocate (result, MDL)) log_fatal ("no memory for return statement."); @@ -1857,13 +1872,13 @@ int parse_executable_statement (result, cfile, lose, case_context) break; case LOG: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!executable_statement_allocate (result, MDL)) log_fatal ("no memory for log statement."); (*result) -> op = log_statement; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { parse_warn (cfile, "left parenthesis expected."); skip_to_semi (cfile); @@ -1871,7 +1886,7 @@ int parse_executable_statement (result, cfile, lose, case_context) return 0; } - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); i = 1; if (token == FATAL) { (*result) -> data.log.priority = log_priority_fatal; @@ -1886,8 +1901,8 @@ int parse_executable_statement (result, cfile, lose, case_context) i = 0; } if (i) { - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) { parse_warn (cfile, "comma expected."); skip_to_semi (cfile); @@ -1903,7 +1918,7 @@ int parse_executable_statement (result, cfile, lose, case_context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { parse_warn (cfile, "right parenthesis expected."); skip_to_semi (cfile); @@ -1911,7 +1926,7 @@ int parse_executable_statement (result, cfile, lose, case_context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SEMI) { parse_warn (cfile, "semicolon expected."); skip_to_semi (cfile); @@ -1924,7 +1939,7 @@ int parse_executable_statement (result, cfile, lose, case_context) because it's appropriate for all DHCP agents with parsers. */ case ZONE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); zone = (struct dns_zone *)0; if (!dns_zone_allocate (&zone, MDL)) log_fatal ("no memory for new zone."); @@ -1958,7 +1973,7 @@ int parse_executable_statement (result, cfile, lose, case_context) /* Also not really a statement, but same idea as above. */ case KEY: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_key (cfile)) { *lose = 1; return 0; @@ -1971,7 +1986,8 @@ int parse_executable_statement (result, cfile, lose, case_context) option_hash_lookup (&option, config_universe -> hash, val, 0, MDL); if (option) { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); return parse_option_statement (result, cfile, 1, option, supersede_option_statement); @@ -2028,14 +2044,14 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile) struct option_cache *oc; int done = 0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace"); return 0; } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); switch (token) { case PRIMARY: if (zone -> primary) { @@ -2059,7 +2075,7 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile) log_fatal ("can't allocate secondary."); oc = zone -> secondary; consemup: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); do { struct expression *expr = (struct expression *)0; if (!parse_ip_addr_or_hostname (&expr, cfile, 0)) { @@ -2086,7 +2102,7 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile) expr, MDL); expression_dereference (&expr, MDL); } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == COMMA); if (token != SEMI) { parse_warn (cfile, "expecting semicolon."); @@ -2096,10 +2112,10 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile) break; case KEY: - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); key_name = (char *)0; } else { key_name = parse_host_name (cfile); @@ -2125,7 +2141,7 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile) } } while (!done); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "expecting right brace."); return 0; @@ -2155,9 +2171,9 @@ int parse_key (struct parse *cfile) if (omapi_auth_key_new (&key, MDL) != ISC_R_SUCCESS) log_fatal ("no memory for key"); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); key -> name = dmalloc (strlen (val) + 1, MDL); if (!key -> name) log_fatal ("no memory for key name."); @@ -2172,14 +2188,14 @@ int parse_key (struct parse *cfile) } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace"); goto bad; } do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case ALGORITHM: if (key -> algorithm) { @@ -2248,9 +2264,9 @@ int parse_key (struct parse *cfile) } /* Allow the BIND 8 syntax, which has a semicolon after each closing brace. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* Remember the key. */ status = omapi_auth_key_enter (key); @@ -2288,7 +2304,7 @@ int parse_on_statement (result, cfile, lose) (*result) -> op = on_statement; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case EXPIRY: (*result) -> data.on.evtypes |= ON_EXPIRY; @@ -2313,7 +2329,7 @@ int parse_on_statement (result, cfile, lose) executable_statement_dereference (result, MDL); return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == OR); /* Semicolon means no statements. */ @@ -2332,13 +2348,14 @@ int parse_on_statement (result, cfile, lose) if (*lose) { /* Try to even things up. */ do { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); } while (token != END_OF_FILE && token != RBRACE); executable_statement_dereference (result, MDL); return 0; } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "right brace expected."); skip_to_semi (cfile); @@ -2366,7 +2383,7 @@ int parse_switch_statement (result, cfile, lose) log_fatal ("no memory for new statement."); (*result) -> op = switch_statement; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { parse_warn (cfile, "expecting left brace."); pfui: @@ -2388,13 +2405,13 @@ int parse_switch_statement (result, cfile, lose) goto gnorf; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { parse_warn (cfile, "right paren expected."); goto pfui; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "left brace expected."); goto pfui; @@ -2409,7 +2426,7 @@ int parse_switch_statement (result, cfile, lose) return 0; } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "right brace expected."); goto pfui; @@ -2451,7 +2468,7 @@ int parse_case_statement (result, cfile, lose, case_context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COLON) { parse_warn (cfile, "colon expected."); goto pfui; @@ -2483,10 +2500,10 @@ int parse_if_statement (result, cfile, lose) (*result) -> op = if_statement; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == LPAREN) { parenp = 1; - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); } else parenp = 0; @@ -2503,7 +2520,7 @@ int parse_if_statement (result, cfile, lose) print_expression ("if condition", if_condition); #endif if (parenp) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { parse_warn (cfile, "expecting right paren."); *lose = 1; @@ -2511,7 +2528,7 @@ int parse_if_statement (result, cfile, lose) return 0; } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "left brace expected."); skip_to_semi (cfile); @@ -2524,13 +2541,14 @@ int parse_if_statement (result, cfile, lose) if (*lose) { /* Try to even things up. */ do { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); } while (token != END_OF_FILE && token != RBRACE); executable_statement_dereference (result, MDL); return 0; } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "right brace expected."); skip_to_semi (cfile); @@ -2538,12 +2556,12 @@ int parse_if_statement (result, cfile, lose) executable_statement_dereference (result, MDL); return 0; } - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == ELSE) { - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == IF) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_if_statement (&(*result) -> data.ie.false, cfile, lose)) { if (!*lose) @@ -2560,14 +2578,14 @@ int parse_if_statement (result, cfile, lose) executable_statement_dereference (result, MDL); return 0; } else { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!(parse_executable_statements (&(*result) -> data.ie.false, cfile, lose, context_any))) { executable_statement_dereference (result, MDL); return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RBRACE) { parse_warn (cfile, "right brace expected."); skip_to_semi (cfile); @@ -2577,7 +2595,7 @@ int parse_if_statement (result, cfile, lose) } } } else if (token == ELSIF) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_if_statement (&(*result) -> data.ie.false, cfile, lose)) { if (!*lose) @@ -2741,14 +2759,15 @@ int parse_non_binary (expr, cfile, lose, context) int i; unsigned long u; isc_result_t status, code; + unsigned len; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); /* Check for unary operators... */ switch (token) { case CHECK: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "string expected."); skip_to_semi (cfile); @@ -2770,9 +2789,9 @@ int parse_non_binary (expr, cfile, lose, context) break; case TOKEN_NOT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (context == context_dns) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); goto not_exists; } if (!expression_allocate (expr, MDL)) @@ -2798,7 +2817,7 @@ int parse_non_binary (expr, cfile, lose, context) break; case LPAREN: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_expression (expr, cfile, lose, context, (struct expression **)0, expr_none)) { if (!*lose) { @@ -2808,7 +2827,7 @@ int parse_non_binary (expr, cfile, lose, context) *lose = 1; return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { *lose = 1; parse_warn (cfile, "right paren expected"); @@ -2820,7 +2839,7 @@ int parse_non_binary (expr, cfile, lose, context) case EXISTS: if (context == context_dns) goto ns_exists; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_exists; @@ -2834,26 +2853,26 @@ int parse_non_binary (expr, cfile, lose, context) break; case STATIC: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_static; break; case KNOWN: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_known; break; case SUBSTRING: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_substring; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { nolparen: expression_dereference (expr, MDL); @@ -2875,7 +2894,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) { nocomma: expression_dereference (expr, MDL); @@ -2898,7 +2917,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -2906,7 +2925,7 @@ int parse_non_binary (expr, cfile, lose, context) (&(*expr) -> data.substring.len, cfile, lose)) goto nonum; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { norparen: parse_warn (cfile, "right parenthesis expected."); @@ -2917,12 +2936,12 @@ int parse_non_binary (expr, cfile, lose, context) break; case SUFFIX: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_suffix; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -2930,7 +2949,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -2938,18 +2957,18 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nonum; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; case CONCAT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_concat; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -2957,7 +2976,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -2966,7 +2985,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == COMMA) { nexp = (struct expression *)0; @@ -2985,12 +3004,12 @@ int parse_non_binary (expr, cfile, lose, context) break; case BINARY_TO_ASCII: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_binary_to_ascii; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -2998,7 +3017,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3006,7 +3025,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3014,7 +3033,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3022,18 +3041,18 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; case REVERSE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_reverse; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -3041,7 +3060,7 @@ int parse_non_binary (expr, cfile, lose, context) (&(*expr) -> data.reverse.width, cfile, lose))) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3049,7 +3068,7 @@ int parse_non_binary (expr, cfile, lose, context) (&(*expr) -> data.reverse.buffer, cfile, lose))) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; @@ -3057,11 +3076,11 @@ int parse_non_binary (expr, cfile, lose, context) case PICK: /* pick (a, b, c) actually produces an internal representation that looks like pick (a, pick (b, pick (c, nil))). */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!(expression_allocate (expr, MDL))) log_fatal ("can't allocate expression"); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -3073,7 +3092,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose))) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == COMMA) { if (!(expression_allocate (&nexp -> data.pick_first_value.cdr, @@ -3097,17 +3116,17 @@ int parse_non_binary (expr, cfile, lose, context) parse_warn (cfile, "Please rebuild dhcpd with --with-nsupdate."); #endif - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == DNS_UPDATE) opcode = expr_ns_add; else opcode = expr_ns_delete; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "parse_expression: expecting string."); @@ -3152,7 +3171,7 @@ int parse_non_binary (expr, cfile, lose, context) if (!make_const_int (&(*ep) -> data.arg.val, u)) log_fatal ("can't allocate rrtype value."); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; ep = &((*ep) -> data.arg.next); @@ -3163,7 +3182,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose))) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3176,7 +3195,7 @@ int parse_non_binary (expr, cfile, lose, context) goto nodata; if (opcode == expr_ns_add) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3192,7 +3211,7 @@ int parse_non_binary (expr, cfile, lose, context) } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; @@ -3202,11 +3221,11 @@ int parse_non_binary (expr, cfile, lose, context) parse_warn (cfile, "Please rebuild dhcpd with --with-nsupdate."); #endif - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -3227,7 +3246,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == COMMA) { if (!(expression_allocate @@ -3245,7 +3264,7 @@ int parse_non_binary (expr, cfile, lose, context) /* NOT EXISTS is special cased above... */ not_exists: - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != EXISTS) { parse_warn (cfile, "expecting DNS prerequisite."); *lose = 1; @@ -3262,7 +3281,7 @@ int parse_non_binary (expr, cfile, lose, context) ns_exists: opcode = expr_ns_exists; nsupdatecode: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); #if !defined (NSUPDATE) parse_warn (cfile, @@ -3272,11 +3291,11 @@ int parse_non_binary (expr, cfile, lose, context) log_fatal ("can't allocate expression"); (*expr) -> op = opcode; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token) && token != NUMBER) { parse_warn (cfile, "expecting identifier or number."); badnsop: @@ -3299,11 +3318,11 @@ int parse_non_binary (expr, cfile, lose, context) goto badnsop; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token) && token != NUMBER) { parse_warn (cfile, "expecting identifier or number."); goto badnsop; @@ -3326,7 +3345,7 @@ int parse_non_binary (expr, cfile, lose, context) goto badnsop; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3334,7 +3353,7 @@ int parse_non_binary (expr, cfile, lose, context) (&(*expr) -> data.ns_add.rrname, cfile, lose))) goto nodata; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3343,7 +3362,7 @@ int parse_non_binary (expr, cfile, lose, context) goto nodata; if (opcode == expr_ns_add) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3357,7 +3376,7 @@ int parse_non_binary (expr, cfile, lose, context) } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; @@ -3369,7 +3388,7 @@ int parse_non_binary (expr, cfile, lose, context) (*expr) -> op = (token == OPTION ? expr_option : expr_config_option); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); known = 0; (*expr) -> data.option = parse_option_name (cfile, 0, &known); if (!(*expr) -> data.option) { @@ -3380,69 +3399,69 @@ int parse_non_binary (expr, cfile, lose, context) break; case HARDWARE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_hardware; break; case LEASED_ADDRESS: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_leased_address; break; case CLIENT_STATE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_client_state; break; case FILENAME: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_filename; break; case SERVER_NAME: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_sname; break; case LEASE_TIME: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_lease_time; break; case TOKEN_NULL: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_null; break; case HOST_DECL_NAME: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_host_decl_name; break; case UPDATED_DNS_RR: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting string."); bad_rrtype: @@ -3458,7 +3477,7 @@ int parse_non_binary (expr, cfile, lose, context) goto bad_rrtype; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; @@ -3473,12 +3492,12 @@ int parse_non_binary (expr, cfile, lose, context) break; case PACKET: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_packet; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; @@ -3486,7 +3505,7 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nonum; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) goto nocomma; @@ -3494,21 +3513,21 @@ int parse_non_binary (expr, cfile, lose, context) cfile, lose)) goto nonum; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; case STRING: - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); if (!make_const_data (expr, (const unsigned char *)val, - strlen (val), 1, 1)) + len, 1, 1)) log_fatal ("can't make constant string expression."); break; case EXTRACT_INT: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { parse_warn (cfile, "left parenthesis expected."); *lose = 1; @@ -3530,7 +3549,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) { parse_warn (cfile, "comma expected."); *lose = 1; @@ -3538,7 +3557,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "number expected."); *lose = 1; @@ -3567,7 +3586,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { parse_warn (cfile, "right parenthesis expected."); *lose = 1; @@ -3577,8 +3596,8 @@ int parse_non_binary (expr, cfile, lose, context) break; case ENCODE_INT: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { parse_warn (cfile, "left parenthesis expected."); *lose = 1; @@ -3597,7 +3616,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != COMMA) { parse_warn (cfile, "comma expected."); *lose = 1; @@ -3605,7 +3624,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "number expected."); *lose = 1; @@ -3634,7 +3653,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) { parse_warn (cfile, "right parenthesis expected."); *lose = 1; @@ -3648,7 +3667,7 @@ int parse_non_binary (expr, cfile, lose, context) number, by itself. */ if (context == context_numeric || context == context_data_or_numeric) { - next_token (&val, cfile); /* Eat the number. */ + next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_const_int; @@ -3671,7 +3690,7 @@ int parse_non_binary (expr, cfile, lose, context) known = FORMERR; goto ns_const; ns_const: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_const_int; @@ -3747,12 +3766,12 @@ int parse_non_binary (expr, cfile, lose, context) goto ns_const; case DEFINED: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LPAREN) goto nolparen; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NAME && token != NUMBER_OR_NAME) { parse_warn (cfile, "%s can't be a variable name", val); skip_to_semi (cfile); @@ -3767,7 +3786,7 @@ int parse_non_binary (expr, cfile, lose, context) if (!(*expr)->data.variable) log_fatal ("can't allocate variable name"); strcpy ((*expr) -> data.variable, val); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != RPAREN) goto norparen; break; @@ -3777,7 +3796,7 @@ int parse_non_binary (expr, cfile, lose, context) if (token != NAME && token != NUMBER_OR_NAME) return 0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* Save the name of the variable being referenced. */ cptr = dmalloc (strlen (val) + 1, MDL); @@ -3786,7 +3805,7 @@ int parse_non_binary (expr, cfile, lose, context) strcpy (cptr, val); /* Simple variable reference, as far as we can tell. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != LPAREN) { if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); @@ -3795,7 +3814,7 @@ int parse_non_binary (expr, cfile, lose, context) break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!expression_allocate (expr, MDL)) log_fatal ("can't allocate expression"); (*expr) -> op = expr_funcall; @@ -3821,7 +3840,7 @@ int parse_non_binary (expr, cfile, lose, context) return 0; } ep = &((*ep) -> data.arg.next); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == COMMA); if (token != RPAREN) { parse_warn (cfile, "Right parenthesis expected."); @@ -3881,11 +3900,11 @@ int parse_expression (expr, cfile, lose, context, plhs, binop) or at least a left-hand-side. If we do not see a binary token as the next token, we're done with the expression. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); switch (token) { case BANG: - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != EQUAL) { parse_warn (cfile, "! in boolean context without ="); *lose = 1; @@ -4000,7 +4019,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop) lhs = rhs; rhs = (struct expression *)0; binop = next_op; - next_token (&val, cfile); /* Consume the operator. */ + next_token (&val, (unsigned *)0, cfile); goto new_rhs; } @@ -4021,7 +4040,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop) } /* Eat the operator token - we now know it was a binary operator... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* If the binary operator we saw previously has a lower precedence than the next operator, then the rhs we just parsed for that @@ -4093,16 +4112,16 @@ int parse_option_statement (result, cfile, lookups, option, op) struct executable_statement *stmt; int ftt = 1; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) { /* Eat the semicolon... */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); goto done; } if (token == EQUAL) { /* Eat the equals sign. */ - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); /* Parse a data expression and use its value for the data. */ if (!parse_data_expression (&expr, cfile, &lose)) { @@ -4163,10 +4182,11 @@ int parse_option_statement (result, cfile, lookups, option, op) expression_dereference (&tmp, MDL); } if ((*fmt == 'A') || (*fmt == 'a')) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); /* Comma means: continue with next element in array */ if (token == COMMA) { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); continue; } /* no comma: end of array. @@ -4205,7 +4225,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) enum dhcp_token token; struct expression *t = (struct expression *)0; unsigned char buf [4]; - int len; + unsigned len; unsigned char *ob; struct iaddr addr; int num; @@ -4214,7 +4234,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) switch (**fmt) { case 'U': - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { if ((*fmt) [1] != 'o') { parse_warn (cfile, "expecting identifier."); @@ -4222,9 +4242,9 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } return 0; } - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); if (!make_const_data (&t, (const unsigned char *)val, - strlen (val), 1, 1)) + len, 1, 1)) log_fatal ("No memory for %s", val); break; @@ -4238,7 +4258,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } *fmt = g; case 'X': - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == NUMBER_OR_NAME || token == NUMBER) { if (!expression_allocate (&t, MDL)) return 0; @@ -4248,9 +4268,9 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } t -> op = expr_const_data; } else if (token == STRING) { - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); if (!make_const_data (&t, (const unsigned char *)val, - strlen (val), 1, 1)) + len, 1, 1)) log_fatal ("No memory for \"%s\"", val); } else { if ((*fmt) [1] != 'o') { @@ -4263,7 +4283,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) break; case 't': /* Text string... */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != STRING && !is_identifier (token)) { if ((*fmt) [1] != 'o') { parse_warn (cfile, "expecting string."); @@ -4272,9 +4292,9 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } return 0; } - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); if (!make_const_data (&t, (const unsigned char *)val, - strlen (val), 1, 1)) + len, 1, 1)) log_fatal ("No memory for concatenation"); break; @@ -4289,7 +4309,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) return 0; } *fmt = g; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "identifier expected"); @@ -4317,10 +4337,10 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) break; case 'T': /* Lease interval. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != INFINITE) goto check_number; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); putLong (buf, -1); if (!make_const_data (&t, buf, 4, 0, 1)) return 0; @@ -4328,7 +4348,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) case 'L': /* Unsigned 32-bit integer... */ case 'l': /* Signed 32-bit integer... */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); check_number: if (token != NUMBER) { need_number: @@ -4339,7 +4359,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } return 0; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); convert_num (cfile, buf, val, 0, 32); if (!make_const_data (&t, buf, 4, 0, 1)) return 0; @@ -4347,10 +4367,10 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) case 's': /* Signed 16-bit integer. */ case 'S': /* Unsigned 16-bit integer. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != NUMBER) goto need_number; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); convert_num (cfile, buf, val, 0, 16); if (!make_const_data (&t, buf, 2, 0, 1)) return 0; @@ -4358,17 +4378,17 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) case 'b': /* Signed 8-bit integer. */ case 'B': /* Unsigned 8-bit integer. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != NUMBER) goto need_number; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); convert_num (cfile, buf, val, 0, 8); if (!make_const_data (&t, buf, 1, 0, 1)) return 0; break; case 'f': /* Boolean flag. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { if ((*fmt) [1] != 'o') parse_warn (cfile, "expecting identifier."); @@ -4392,7 +4412,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) parse_warn (cfile, "expecting boolean."); goto bad_flag; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!make_const_data (&t, buf, 1, 0, 1)) return 0; break; @@ -4462,14 +4482,14 @@ int parse_option_decl (oc, cfile) break; case 't': /* Text string... */ - token = next_token (&val, cfile); + token = next_token (&val, + &len, cfile); if (token != STRING) { parse_warn (cfile, "expecting string."); skip_to_semi (cfile); return 0; } - len = strlen (val); if (hunkix + len + 1 > sizeof hunkbuf) { parse_warn (cfile, "option data buffer %s", @@ -4493,7 +4513,8 @@ int parse_option_decl (oc, cfile) skip_to_semi (cfile); return 0; } - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "identifier expected"); @@ -4529,7 +4550,8 @@ int parse_option_decl (oc, cfile) case 'L': /* Unsigned 32-bit integer... */ case 'l': /* Signed 32-bit integer... */ - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (token != NUMBER) { need_number: parse_warn (cfile, @@ -4545,7 +4567,8 @@ int parse_option_decl (oc, cfile) case 's': /* Signed 16-bit integer. */ case 'S': /* Unsigned 16-bit integer. */ - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (token != NUMBER) goto need_number; convert_num (cfile, buf, val, 0, 16); @@ -4555,7 +4578,8 @@ int parse_option_decl (oc, cfile) case 'b': /* Signed 8-bit integer. */ case 'B': /* Unsigned 8-bit integer. */ - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (token != NUMBER) goto need_number; convert_num (cfile, buf, val, 0, 8); @@ -4564,7 +4588,8 @@ int parse_option_decl (oc, cfile) goto alloc; case 'f': /* Boolean flag. */ - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (!is_identifier (token)) { parse_warn (cfile, "expecting identifier."); @@ -4595,7 +4620,7 @@ int parse_option_decl (oc, cfile) return 0; } } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (*fmt == 'A' && token == COMMA); if (token != SEMI) { @@ -4634,11 +4659,11 @@ int parse_X (cfile, buf, max) unsigned len; u_int8_t *s; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == NUMBER_OR_NAME || token == NUMBER) { len = 0; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER && token != NUMBER_OR_NAME) { parse_warn (cfile, "expecting hexadecimal constant."); @@ -4652,14 +4677,14 @@ int parse_X (cfile, buf, max) skip_to_semi (cfile); return 0; } - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == COLON) - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); } while (token == COLON); val = (char *)buf; } else if (token == STRING) { - token = next_token (&val, cfile); - len = strlen (val); + token = next_token (&val, &len, cfile); if (len + 1 > max) { parse_warn (cfile, "string constant too long."); skip_to_semi (cfile); diff --git a/common/resolv.c b/common/resolv.c index 051a672b1..ed967ab9f 100644 --- a/common/resolv.c +++ b/common/resolv.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: resolv.c,v 1.14 2001/03/01 18:17:02 mellon Exp $ Copyright (c) 1996-2001 The Internet Software Consortium. All rights reserved.\n"; +"$Id: resolv.c,v 1.15 2001/03/17 00:47:34 mellon Exp $ Copyright (c) 1996-2001 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -74,7 +74,7 @@ void read_resolv_conf (parse_time) cfile -> eol_token = 1; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) break; else if (token == EOL) @@ -106,14 +106,15 @@ void read_resolv_conf (parse_time) dn = (char *)0; } nd -> rcdate = parse_time; - token = peek_token (&val, cfile); + token = peek_token (&val, + (unsigned *)0, cfile); } while (token != EOL); if (token != EOL) { parse_warn (cfile, "junk after domain declaration"); skip_to_semi (cfile); } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } else if (token == NAMESERVER) { struct name_server *ns, **sp; struct iaddr iaddr; @@ -149,7 +150,7 @@ void read_resolv_conf (parse_time) } else skip_to_semi (cfile); /* Ignore what we don't grok. */ } while (1); - token = next_token (&val, cfile); /* Clear the peek buffer */ + token = next_token (&val, (unsigned *)0, cfile); /* Lose servers that are no longer in /etc/resolv.conf. */ sl = (struct name_server *)0; diff --git a/dhcpctl/omshell.c b/dhcpctl/omshell.c index 24a85cb8d..46198270d 100644 --- a/dhcpctl/omshell.c +++ b/dhcpctl/omshell.c @@ -218,7 +218,7 @@ int main (int argc, char **argv, char **envp) status = new_parse (&cfile, 0, buf, strlen(buf), ""); check(status, "new_parse()"); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { default: parse_warn (cfile, "unknown token: %s", val); @@ -237,9 +237,10 @@ int main (int argc, char **argv, char **envp) break; case TOKEN_NEW: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if ((!is_identifier (token) && token != STRING) || - next_token (NULL, cfile) != END_OF_FILE) + next_token (NULL, + (unsigned *)0, cfile) != END_OF_FILE) { printf ("usage: new \n"); break; @@ -260,7 +261,8 @@ int main (int argc, char **argv, char **envp) break; case TOKEN_CLOSE: - if (next_token (NULL, cfile) != END_OF_FILE) { + if (next_token (NULL, + (unsigned *)0, cfile) != END_OF_FILE) { printf ("usage: close\n"); } @@ -269,10 +271,10 @@ int main (int argc, char **argv, char **envp) break; case TOKEN_SET: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if ((!is_identifier (token) && token != STRING) || - next_token (NULL, cfile) != '=') + next_token (NULL, (unsigned *)0, cfile) != '=') { printf ("usage: set = \n"); break; @@ -286,7 +288,7 @@ int main (int argc, char **argv, char **envp) s1[0] = '\0'; strncat (s1, val, sizeof(s1)-1); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case STRING: dhcpctl_set_string_value (oh, val, s1); @@ -304,7 +306,8 @@ int main (int argc, char **argv, char **envp) case TOKEN_CREATE: case TOKEN_OPEN: - if (next_token (NULL, cfile) != END_OF_FILE) { + if (next_token (NULL, + (unsigned *)0, cfile) != END_OF_FILE) { printf ("usage: %s\n", val); } @@ -327,7 +330,8 @@ int main (int argc, char **argv, char **envp) break; case UPDATE: - if (next_token (NULL, cfile) != END_OF_FILE) { + if (next_token (NULL, (unsigned *)0, + cfile) != END_OF_FILE) { printf ("usage: %s\n", val); } diff --git a/includes/dhcpd.h b/includes/dhcpd.h index 3e8ba90e4..e26802280 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -119,6 +119,7 @@ struct parse { enum dhcp_token token; int ugflag; char *tval; + int tlen; char tokbuf [1500]; #ifdef OLD_LEXER @@ -1081,8 +1082,8 @@ int dhcpd_interface_setup_hook (struct interface_info *ip, struct iaddr *ia); isc_result_t new_parse PROTO ((struct parse **, int, char *, unsigned, const char *)); isc_result_t end_parse PROTO ((struct parse **)); -enum dhcp_token next_token PROTO ((const char **, struct parse *)); -enum dhcp_token peek_token PROTO ((const char **, struct parse *)); +enum dhcp_token next_token PROTO ((const char **, unsigned *, struct parse *)); +enum dhcp_token peek_token PROTO ((const char **, unsigned *, struct parse *)); /* confpars.c */ void parse_trace_setup (void); @@ -1132,7 +1133,7 @@ struct enumeration_value *find_enumeration_value (const char *, int, void skip_to_semi PROTO ((struct parse *)); void skip_to_rbrace PROTO ((struct parse *, int)); int parse_semi PROTO ((struct parse *)); -char *parse_string PROTO ((struct parse *)); +int parse_string PROTO ((struct parse *, char **, unsigned *)); char *parse_host_name PROTO ((struct parse *)); int parse_ip_addr_or_hostname PROTO ((struct expression **, struct parse *, int)); diff --git a/server/confpars.c b/server/confpars.c index 86e5555ca..5cc02d2dc 100644 --- a/server/confpars.c +++ b/server/confpars.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: confpars.c,v 1.134 2001/03/01 18:17:07 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; +"$Id: confpars.c,v 1.135 2001/03/17 00:47:39 mellon Exp $ Copyright (c) 1995-2001 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -238,14 +238,14 @@ isc_result_t conf_file_subparse (struct parse *cfile, struct group *group, int status; do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) break; declaration = parse_statement (cfile, group, group_type, (struct host_decl *)0, declaration); } while (1); - token = next_token (&val, cfile); /* Clear the peek buffer */ + token = next_token (&val, (unsigned *)0, cfile); status = cfile -> warnings_occurred ? ISC_R_BADPARSE : ISC_R_SUCCESS; return status; @@ -263,7 +263,7 @@ isc_result_t lease_file_subparse (struct parse *cfile) isc_result_t status; do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == END_OF_FILE) break; if (token == LEASE) { @@ -348,12 +348,12 @@ int parse_statement (cfile, group, type, host_decl, declaration) int known; isc_result_t status; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); switch (token) { case INCLUDE: - next_token (&val, cfile); - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "filename string expected."); skip_to_semi (cfile); @@ -366,7 +366,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case HOST: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type != HOST_DECL && type != CLASS_DECL) parse_host_declaration (cfile, group); else { @@ -377,7 +377,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case GROUP: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type != HOST_DECL && type != CLASS_DECL) parse_group_declaration (cfile, group); else { @@ -388,12 +388,12 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case TIMESTAMP: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); parsed_time = parse_timestamp (cfile); break; case SHARED_NETWORK: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == SHARED_NET_DECL || type == HOST_DECL || type == SUBNET_DECL || @@ -408,7 +408,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case SUBNET: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == HOST_DECL || type == SUBNET_DECL || type == CLASS_DECL) { parse_warn (cfile, @@ -462,7 +462,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case VENDOR_CLASS: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == CLASS_DECL) { parse_warn (cfile, "class declarations not allowed here."); @@ -473,7 +473,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case USER_CLASS: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == CLASS_DECL) { parse_warn (cfile, "class declarations not allowed here."); @@ -484,7 +484,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case CLASS: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == CLASS_DECL) { parse_warn (cfile, "class declarations not allowed here."); @@ -495,7 +495,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case SUBCLASS: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type == CLASS_DECL) { parse_warn (cfile, "class declarations not allowed here."); @@ -506,7 +506,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return 1; case HARDWARE: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); memset (&hardware, 0, sizeof hardware); parse_hardware_param (cfile, &hardware); if (host_decl) @@ -517,7 +517,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) break; case FIXED_ADDR: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); cache = (struct option_cache *)0; if (parse_fixed_addr_param (&cache, cfile)) { if (host_decl) @@ -532,7 +532,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) break; case POOL: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type != SUBNET_DECL && type != SHARED_NET_DECL) { parse_warn (cfile, "pool declared outside of network"); } @@ -543,7 +543,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) return declaration; case RANGE: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (type != SUBNET_DECL || !group -> subnet) { parse_warn (cfile, "range declaration not allowed here."); @@ -554,8 +554,8 @@ int parse_statement (cfile, group, type, host_decl, declaration) return declaration; case TOKEN_NOT: - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case AUTHORITATIVE: group -> authoritative = 0; @@ -567,7 +567,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) } break; case AUTHORITATIVE: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); group -> authoritative = 1; authoritative: if (type == HOST_DECL) @@ -579,12 +579,12 @@ int parse_statement (cfile, group, type, host_decl, declaration) "option dhcp-server-identifier". */ case SERVER_IDENTIFIER: option = dhcp_universe.options [DHO_DHCP_SERVER_IDENTIFIER]; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); goto finish_option; case OPTION: - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SPACE) { if (type != ROOT_GROUP) { parse_warn (cfile, @@ -600,7 +600,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) known = 0; option = parse_option_name (cfile, 1, &known); if (option) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == CODE) { if (type != ROOT_GROUP) { parse_warn (cfile, @@ -610,7 +610,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) free_option (option, MDL); break; } - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (!parse_option_code_definition (cfile, option)) free_option (option, MDL); @@ -648,7 +648,7 @@ int parse_statement (cfile, group, type, host_decl, declaration) skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); #if defined (FAILOVER_PROTOCOL) parse_failover_peer (cfile, group, type); #else @@ -736,14 +736,14 @@ void parse_failover_peer (cfile, group, type) isc_result_t status; dhcp_failover_config_t *cp; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != PEER) { parse_warn (cfile, "expecting \"peer\""); skip_to_semi (cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (is_identifier (token) || token == STRING) { name = dmalloc (strlen (val) + 1, MDL); if (!name) @@ -759,7 +759,7 @@ void parse_failover_peer (cfile, group, type) peer = (dhcp_failover_state_t *)0; find_failover_peer (&peer, name, MDL); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == SEMI) { dfree (name, MDL); if (type != SHARED_NET_DECL) @@ -816,7 +816,7 @@ void parse_failover_peer (cfile, group, type) do { cp = &peer -> me; peer: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case RBRACE: break; @@ -851,7 +851,7 @@ void parse_failover_peer (cfile, group, type) break; case PORT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting number"); skip_to_rbrace (cfile, 1); @@ -862,7 +862,7 @@ void parse_failover_peer (cfile, group, type) case MAX_RESPONSE_DELAY: tp = &cp -> max_response_delay; parse_idle: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting number."); skip_to_rbrace (cfile, 1); @@ -908,7 +908,7 @@ void parse_failover_peer (cfile, group, type) break; case SPLIT: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (peer -> i_am == secondary) parse_warn (cfile, "secondary may not define %s", @@ -934,24 +934,24 @@ void parse_failover_peer (cfile, group, type) break; case LOAD: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != BALANCE) { parse_warn (cfile, "expecting 'balance'"); badload: skip_to_rbrace (cfile, 1); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != TOKEN_MAX) { parse_warn (cfile, "expecting 'max'"); goto badload; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SECONDS) { parse_warn (cfile, "expecting 'secs'"); goto badload; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting number"); goto badload; @@ -998,14 +998,14 @@ void parse_failover_state_declaration (struct parse *cfile, dhcp_failover_config_t *cp; if (!peer) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != PEER) { parse_warn (cfile, "expecting \"peer\""); skip_to_semi (cfile); return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (is_identifier (token) || token == STRING) { name = dmalloc (strlen (val) + 1, MDL); if (!name) @@ -1027,7 +1027,7 @@ void parse_failover_state_declaration (struct parse *cfile, return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STATE) { parse_warn (cfile, "expecting 'state'"); if (token != SEMI) @@ -1038,7 +1038,7 @@ void parse_failover_state_declaration (struct parse *cfile, state = (dhcp_failover_state_t *)0; dhcp_failover_state_reference (&state, peer, MDL); } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace"); if (token != SEMI) @@ -1047,14 +1047,14 @@ void parse_failover_state_declaration (struct parse *cfile, return; } do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case RBRACE: break; case MY: cp = &state -> me; do_state: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STATE) { parse_warn (cfile, "expecting 'state'"); goto bogus; @@ -1088,7 +1088,7 @@ void parse_failover_state (cfile, state, stos) enum failover_state state_in; TIME stos_in; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case UNKNOWN_STATE: state_in = unknown_state; @@ -1140,7 +1140,7 @@ void parse_failover_state (cfile, state, stos) return; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != AT) { parse_warn (cfile, "expecting \"at\""); skip_to_semi (cfile); @@ -1204,13 +1204,14 @@ void parse_pool_statement (cfile, group, type) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); switch (token) { case NO: - next_token (&val, cfile); - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != FAILOVER || - (token = next_token (&val, cfile)) != PEER) { + (token = next_token (&val, (unsigned *)0, + cfile)) != PEER) { parse_warn (cfile, "expecting \"failover peer\"."); skip_to_semi (cfile); @@ -1225,14 +1226,14 @@ void parse_pool_statement (cfile, group, type) #if defined (FAILOVER_PROTOCOL) case FAILOVER: - next_token (&val, cfile); - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != PEER) { parse_warn (cfile, "expecting 'peer'."); skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting string."); skip_to_semi (cfile); @@ -1252,7 +1253,7 @@ void parse_pool_statement (cfile, group, type) #endif case RANGE: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); parse_address_range (cfile, group, type, pool); break; case ALLOW: @@ -1261,13 +1262,14 @@ void parse_pool_statement (cfile, group, type) permit = new_permit (MDL); if (!permit) log_fatal ("no memory for permit"); - next_token (&val, cfile); - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case UNKNOWN: permit -> type = permit_unknown_clients; get_clients: - if (next_token (&val, cfile) != CLIENTS) { + if (next_token (&val, (unsigned *)0, + cfile) != CLIENTS) { parse_warn (cfile, "expecting \"clients\""); skip_to_semi (cfile); @@ -1300,7 +1302,8 @@ void parse_pool_statement (cfile, group, type) case DYNAMIC: permit -> type = permit_dynamic_bootp_clients; - if (next_token (&val, cfile) != TOKEN_BOOTP) { + if (next_token (&val, (unsigned *)0, + cfile) != TOKEN_BOOTP) { parse_warn (cfile, "expecting \"bootp\""); skip_to_semi (cfile); @@ -1310,13 +1313,15 @@ void parse_pool_statement (cfile, group, type) goto get_clients; case MEMBERS: - if (next_token (&val, cfile) != OF) { + if (next_token (&val, (unsigned *)0, + cfile) != OF) { parse_warn (cfile, "expecting \"of\""); skip_to_semi (cfile); free_permit (permit, MDL); continue; } - if (next_token (&val, cfile) != STRING) { + if (next_token (&val, (unsigned *)0, + cfile) != STRING) { parse_warn (cfile, "expecting class name."); skip_to_semi (cfile); @@ -1347,7 +1352,7 @@ void parse_pool_statement (cfile, group, type) goto get_permit; case RBRACE: - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); done = 1; break; @@ -1416,7 +1421,7 @@ int parse_boolean (cfile) const char *val; int rv; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!strcasecmp (val, "true") || !strcasecmp (val, "on")) rv = 1; @@ -1442,7 +1447,7 @@ int parse_lbrace (cfile) enum dhcp_token token; const char *val; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LBRACE) { parse_warn (cfile, "expecting left brace."); skip_to_semi (cfile); @@ -1491,13 +1496,13 @@ void parse_host_declaration (cfile, group) goto boom; do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); break; } if (token == END_OF_FILE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } @@ -1505,7 +1510,7 @@ void parse_host_declaration (cfile, group) remember to save it. */ if (token == DYNAMIC) { dynamicp = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_semi (cfile)) break; continue; @@ -1514,7 +1519,7 @@ void parse_host_declaration (cfile, group) remember to save it. */ if (token == TOKEN_DELETED) { deleted = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_semi (cfile)) break; continue; @@ -1522,8 +1527,8 @@ void parse_host_declaration (cfile, group) if (token == GROUP) { struct group_object *go; - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING && !is_identifier (token)) { parse_warn (cfile, "expecting string or identifier."); @@ -1553,15 +1558,14 @@ void parse_host_declaration (cfile, group) unsigned char *t = 0; unsigned len; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); data_string_forget (&host -> client_identifier, MDL); /* See if it's a string or a cshl. */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { - token = next_token (&val, cfile); + token = next_token (&val, &len, cfile); s = val; - len = strlen (val); host -> client_identifier.terminated = 1; } else { len = 0; @@ -1658,7 +1662,7 @@ int parse_class_declaration (cp, cfile, group, type) int new = 1; isc_result_t status; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "Expecting class name"); skip_to_semi (cfile); @@ -1715,10 +1719,9 @@ int parse_class_declaration (cp, cfile, group, type) /* If this is a straight subclass, parse the hash string. */ if (type == 3) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { - token = next_token (&val, cfile); - data.len = strlen (val); + token = next_token (&val, &data.len, cfile); data.buffer = (struct buffer *)0; if (!buffer_allocate (&data.buffer, data.len + 1, MDL)) { @@ -1729,7 +1732,8 @@ int parse_class_declaration (cp, cfile, group, type) } data.terminated = 1; data.data = &data.buffer -> data [0]; - strcpy ((char *)data.buffer -> data, val); + memcpy ((char *)data.buffer -> data, val, + data.len + 1); } else if (token == NUMBER_OR_NAME || token == NUMBER) { memset (&data, 0, sizeof data); if (!parse_cshl (&data, cfile)) { @@ -1812,9 +1816,9 @@ int parse_class_declaration (cp, cfile, group, type) /* Spawned classes don't have to have their own settings. */ if (class -> superclass) { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) { - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); if (cp) status = class_reference (cp, class, MDL); class_dereference (&class, MDL); @@ -1834,12 +1838,12 @@ int parse_class_declaration (cp, cfile, group, type) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == MATCH) { @@ -1854,11 +1858,11 @@ int parse_class_declaration (cp, cfile, group, type) skip_to_semi (cfile); break; } - token = next_token (&val, cfile); - token = peek_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token != IF) goto submatch; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!parse_boolean_expression (&class -> expr, cfile, &lose)) { if (!lose) { @@ -1880,9 +1884,9 @@ int parse_class_declaration (cp, cfile, group, type) skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); class -> spawning = 1; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != WITH) { parse_warn (cfile, "expecting with after spawn"); @@ -1912,15 +1916,15 @@ int parse_class_declaration (cp, cfile, group, type) parse_semi (cfile); } } else if (token == LEASE) { - next_token (&val, cfile); - token = next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != LIMIT) { parse_warn (cfile, "expecting \"limit\""); if (token != SEMI) skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting a number"); if (token != SEMI) @@ -1988,9 +1992,9 @@ void parse_shared_net_declaration (cfile, group) share, MDL); /* Get the name of the shared network... */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (val [0] == 0) { parse_warn (cfile, "zero-length shared network name"); @@ -2018,9 +2022,9 @@ void parse_shared_net_declaration (cfile, group) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!share -> subnets) parse_warn (cfile, "empty shared-network decl"); @@ -2029,12 +2033,12 @@ void parse_shared_net_declaration (cfile, group) shared_network_dereference (&share, MDL); return; } else if (token == END_OF_FILE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == INTERFACE) { - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); new_shared_network_interface (cfile, share, val); if (!parse_semi (cfile)) break; @@ -2085,7 +2089,7 @@ void parse_subnet_declaration (cfile, share) iaddr.len = len; subnet -> net = iaddr; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NETMASK) { parse_warn (cfile, "Expecting netmask"); skip_to_semi (cfile); @@ -2119,17 +2123,17 @@ void parse_subnet_declaration (cfile, share) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == INTERFACE) { - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); new_shared_network_interface (cfile, share, val); if (!parse_semi (cfile)) break; @@ -2193,9 +2197,9 @@ void parse_group_declaration (cfile, group) if (!clone_group (&g, group, MDL)) log_fatal ("no memory for explicit group."); - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (is_identifier (token) || token == STRING) { - next_token (&val, cfile); + next_token (&val, (unsigned *)0, cfile); name = dmalloc (strlen (val) + 1, MDL); if (!name) @@ -2209,24 +2213,24 @@ void parse_group_declaration (cfile, group) } do { - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == TOKEN_DELETED) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); deletedp = 1; } else if (token == DYNAMIC) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); dynamicp = 1; } else if (token == STATIC) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); staticp = 1; } @@ -2295,9 +2299,9 @@ int parse_fixed_addr_param (oc, cfile) expression_dereference (&expr, MDL); return 0; } - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == COMMA) - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); } while (token == COMMA); if (!parse_semi (cfile)) { @@ -2364,6 +2368,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) struct option_cache *oc; pair *p; binding_state_t new_state; + unsigned buflen = 0; lease = (struct lease *)0; status = lease_allocate (&lease, MDL); @@ -2384,7 +2389,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) } do { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == RBRACE) break; else if (token == END_OF_FILE) { @@ -2442,26 +2447,31 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) /* Colon-seperated hexadecimal octets... */ case UID: seenbit = 8; - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { unsigned char *tuid; - token = next_token (&val, cfile); - lease -> uid_len = strlen (val); - tuid = ((unsigned char *) - dmalloc (lease -> uid_len, MDL)); - if (!tuid) { - log_error ("no space for uid"); - lease_dereference (&lease, MDL); - return 0; + token = next_token (&val, &buflen, cfile); + lease -> uid_len = buflen; + if (buflen < sizeof lease -> uid_buf) + tuid = lease -> uid_buf; + else { + tuid = ((unsigned char *) + dmalloc (buflen, MDL)); + if (!tuid) { + log_error ("no space for uid"); + lease_dereference (&lease, + MDL); + return 0; + } } memcpy (tuid, val, lease -> uid_len); lease -> uid = tuid; } else { - unsigned uid_len = 0; + buflen = 0; lease -> uid = (parse_numeric_aggregate (cfile, (unsigned char *)0, - &uid_len, ':', 16, 8)); - lease -> uid_len = uid_len; + &buflen, ':', 16, 8)); + lease -> uid_len = buflen; if (!lease -> uid) { lease_dereference (&lease, MDL); return 0; @@ -2482,7 +2492,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) case CLASS: seenbit = 32; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (!is_identifier (token)) { if (token != SEMI) skip_to_rbrace (cfile, 1); @@ -2515,7 +2525,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) case TOKEN_NEXT: seenbit = 128; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != BINDING) { parse_warn (cfile, "expecting 'binding'"); skip_to_semi (cfile); @@ -2527,13 +2537,13 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) seenbit = 256; do_binding_state: - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != STATE) { parse_warn (cfile, "expecting 'state'"); skip_to_semi (cfile); break; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case TOKEN_ABANDONED: new_state = FTS_ABANDONED; @@ -2585,30 +2595,35 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) case CLIENT_HOSTNAME: seenbit = 1024; - token = peek_token (&val, cfile); - if (token == STRING) - lease -> client_hostname = - parse_string (cfile); - else { + token = peek_token (&val, (unsigned *)0, cfile); + if (token == STRING) { + if (!parse_string (cfile, + &lease -> client_hostname, + (unsigned *)0)) { + lease_dereference (&lease, MDL); + return 0; + } + } else { lease -> client_hostname = parse_host_name (cfile); if (lease -> client_hostname) parse_semi (cfile); - } - if (!lease -> client_hostname) { - parse_warn (cfile, "expecting a hostname."); - skip_to_semi (cfile); - seenbit = 0; - lease_dereference (&lease, MDL); - return 0; + else { + parse_warn (cfile, + "expecting a hostname."); + skip_to_semi (cfile); + lease_dereference (&lease, MDL); + return 0; + } } break; case BILLING: seenbit = 2048; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token == CLASS) { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); if (token != STRING) { parse_warn (cfile, "expecting string"); if (token != SEMI) @@ -2692,7 +2707,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) case TOKEN_SET: noequal = 0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NAME && token != NUMBER_OR_NAME) { parse_warn (cfile, "%s can't be a variable name", @@ -2735,7 +2750,7 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) log_fatal ("no memory for binding value."); if (!noequal) { - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != EQUAL) { parse_warn (cfile, "expecting '=' in set statement."); @@ -2743,20 +2758,20 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) } } - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { unsigned char *tuid; - token = next_token (&val, cfile); + token = next_token (&val, &buflen, cfile); binding -> value -> type = binding_data; - binding -> value -> value.data.len = strlen (val); + binding -> value -> value.data.len = buflen; if (!(buffer_allocate (&binding -> value -> value.data.buffer, - binding -> value-> value.data.len + 1, - MDL))) + buflen + 1, MDL))) log_fatal ("No memory for binding."); - strcpy ((char *) + memcpy ((char *) (binding -> value -> - value.data.buffer -> data), val); + value.data.buffer -> data), + val, buflen + 1); binding -> value -> value.data.data = binding -> value -> value.data.buffer -> data; binding -> value -> value.data.terminated = 1; @@ -2787,8 +2802,8 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) binding -> value -> value.data.buffer -> data; } } else if (token == PERCENT) { - token = next_token (&val, cfile); - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting decimal number."); @@ -2802,7 +2817,8 @@ int parse_lease_declaration (struct lease **lp, struct parse *cfile) binding -> value -> type = binding_numeric; binding -> value -> value.intval = atol (val); } else if (token == NAME) { - token = next_token (&val, cfile); + token = next_token (&val, + (unsigned *)0, cfile); binding -> value -> type = binding_boolean; if (!strcasecmp (val, "true")) binding -> value -> value.boolean = 1; @@ -2901,8 +2917,9 @@ void parse_address_range (cfile, group, type, inpool) struct pool *pool; isc_result_t status; - if ((token = peek_token (&val, cfile)) == DYNAMIC_BOOTP) { - token = next_token (&val, cfile); + if ((token = peek_token (&val, + (unsigned *)0, cfile)) == DYNAMIC_BOOTP) { + token = next_token (&val, (unsigned *)0, cfile); dynamic = 1; } @@ -2913,7 +2930,7 @@ void parse_address_range (cfile, group, type, inpool) low.len = len; /* Only one address? */ - token = peek_token (&val, cfile); + token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) high = low; else { @@ -2924,7 +2941,7 @@ void parse_address_range (cfile, group, type, inpool) high.len = len; } - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); if (token != SEMI) { parse_warn (cfile, "semicolon expected."); skip_to_semi (cfile); @@ -3063,7 +3080,7 @@ int parse_allow_deny (oc, cfile, flag) if (!make_const_data (&data, &rf, 1, 0, 1)) return 0; - token = next_token (&val, cfile); + token = next_token (&val, (unsigned *)0, cfile); switch (token) { case TOKEN_BOOTP: status = option_cache (oc, (struct data_string *)0, data,