Parser for dhcpd config file... */
/*
- * Copyright (c) 2004-2012 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2004-2013 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 1995-2003 by Internet Software Consortium
*
* Permission to use, copy, modify, and distribute this software for any
(struct host_decl *)0,
declaration);
} while (1);
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
status = cfile->warnings_occurred ? DHCP_R_BADPARSE : ISC_R_SUCCESS;
return status;
switch (token) {
case INCLUDE:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
if (token != STRING) {
parse_warn (cfile, "filename string expected.");
return 1;
case HOST:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type != HOST_DECL && type != CLASS_DECL) {
if (global_host_once &&
(type == SUBNET_DECL || type == SHARED_NET_DECL)) {
return 1;
case GROUP:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type != HOST_DECL && type != CLASS_DECL)
parse_group_declaration (cfile, group);
else {
return 1;
case SHARED_NETWORK:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == SHARED_NET_DECL ||
type == HOST_DECL ||
type == SUBNET_DECL ||
case SUBNET:
case SUBNET6:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == HOST_DECL || type == SUBNET_DECL ||
type == CLASS_DECL) {
parse_warn (cfile,
return 1;
case VENDOR_CLASS:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == CLASS_DECL) {
parse_warn (cfile,
"class declarations not allowed here.");
return 1;
case USER_CLASS:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == CLASS_DECL) {
parse_warn (cfile,
"class declarations not allowed here.");
return 1;
case CLASS:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == CLASS_DECL) {
parse_warn (cfile,
"class declarations not allowed here.");
return 1;
case SUBCLASS:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == CLASS_DECL) {
parse_warn (cfile,
"class declarations not allowed here.");
return 1;
case HARDWARE:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
memset (&hardware, 0, sizeof hardware);
if (host_decl && memcmp(&hardware, &(host_decl->interface),
sizeof(hardware)) != 0) {
case FIXED_ADDR:
case FIXED_ADDR6:
- next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
cache = NULL;
if (parse_fixed_addr_param(&cache, cfile, token)) {
if (host_decl) {
break;
case POOL:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type == POOL_DECL) {
parse_warn (cfile, "pool declared within pool.");
skip_to_semi(cfile);
return declaration;
case RANGE:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (type != SUBNET_DECL || !group -> subnet) {
parse_warn (cfile,
"range declaration not allowed here.");
#ifdef DHCPv6
case RANGE6:
- next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
if ((type != SUBNET_DECL) || (group->subnet == NULL)) {
parse_warn (cfile,
"range6 declaration not allowed here.");
return declaration;
case PREFIX6:
- next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
if ((type != SUBNET_DECL) || (group->subnet == NULL)) {
parse_warn (cfile,
"prefix6 declaration not allowed here.");
return declaration;
case FIXED_PREFIX6:
- next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
if (!host_decl) {
parse_warn (cfile,
"fixed-prefix6 declaration not "
#endif /* DHCPv6 */
case TOKEN_NOT:
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
switch (token) {
case AUTHORITATIVE:
}
break;
case AUTHORITATIVE:
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
group -> authoritative = 1;
authoritative:
if (type == HOST_DECL)
&code, 0, MDL))
log_fatal("Server identifier not in hash (%s:%d).",
MDL);
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
goto finish_option;
case OPTION:
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = peek_token (&val, (unsigned *)0, cfile);
if (token == SPACE) {
if (type != ROOT_GROUP) {
option_dereference(&option, MDL);
break;
}
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
/*
* If the option was known, remove it from the
token = peek_token (&val, (unsigned *)0, cfile);
switch (token) {
case TOKEN_NO:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
if (token != FAILOVER ||
(token = next_token (&val, (unsigned *)0,
#if defined (FAILOVER_PROTOCOL)
case FAILOVER:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
if (token != PEER) {
parse_warn (cfile, "expecting 'peer'.");
#endif
case RANGE:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
parse_address_range (cfile, group, type,
pool, &lpchain);
break;
permit = new_permit (MDL);
if (!permit)
log_fatal ("no memory for permit");
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
switch (token) {
case UNKNOWN:
goto get_permit;
case RBRACE:
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
done = 1;
break;
do {
token = peek_token (&val, (unsigned *)0, cfile);
if (token == RBRACE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
break;
}
if (token == END_OF_FILE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
parse_warn (cfile, "unexpected end of file");
break;
}
remember to save it. */
if (token == DYNAMIC) {
dynamicp = 1;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (!parse_semi (cfile))
break;
continue;
remember to save it. */
if (token == TOKEN_DELETED) {
deleted = 1;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (!parse_semi (cfile))
break;
continue;
if (token == GROUP) {
struct group_object *go;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
if (token != STRING && !is_identifier (token)) {
parse_warn (cfile,
unsigned char *t = 0;
unsigned len;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
data_string_forget (&host -> client_identifier, MDL);
if (host->client_identifier.len != 0) {
/* See if it's a string or a cshl. */
token = peek_token (&val, (unsigned *)0, cfile);
if (token == STRING) {
- token = next_token (&val, &len, cfile);
+ skip_token(&val, &len, cfile);
s = val;
host -> client_identifier.terminated = 1;
} else {
skip_to_rbrace(cfile, 1);
break;
}
- next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
token = next_token(&val, NULL, cfile);
if (token != OPTION) {
parse_warn(cfile,
if (type == CLASS_TYPE_SUBCLASS) {
token = peek_token (&val, (unsigned *)0, cfile);
if (token == STRING) {
- token = next_token (&val, &data.len, cfile);
+ skip_token(&val, &data.len, cfile);
data.buffer = (struct buffer *)0;
if (!buffer_allocate (&data.buffer,
data.len + 1, MDL)) {
if (class -> superclass) {
token = peek_token (&val, (unsigned *)0, cfile);
if (token == SEMI) {
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (cp)
status = class_reference (cp, class, MDL);
class_dereference (&class, MDL);
do {
token = peek_token (&val, (unsigned *)0, cfile);
if (token == RBRACE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
break;
} else if (token == END_OF_FILE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
parse_warn (cfile, "unexpected end of file");
break;
} else if (token == DYNAMIC) {
class->flags |= CLASS_DECL_DYNAMIC;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (!parse_semi (cfile))
break;
continue;
} else if (token == TOKEN_DELETED) {
class->flags |= CLASS_DECL_DELETED;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (!parse_semi (cfile))
break;
continue;
skip_to_semi (cfile);
break;
}
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = peek_token (&val, (unsigned *)0, cfile);
if (token != IF)
goto submatch;
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (matchedonce) {
parse_warn(cfile, "A class may only have "
"one 'match if' clause.");
parse_semi (cfile);
}
} else if (token == SPAWN) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (pc) {
parse_warn (cfile,
"invalid spawn in subclass.");
parse_semi (cfile);
}
} else if (token == LEASE) {
- next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
if (token != LIMIT) {
parse_warn (cfile, "expecting \"limit\"");
/* Get the name of the shared network... */
token = peek_token (&val, (unsigned *)0, cfile);
if (token == STRING) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (val [0] == 0) {
parse_warn (cfile, "zero-length shared network name");
do {
token = peek_token (&val, (unsigned *)0, cfile);
if (token == RBRACE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
if (!share -> subnets)
parse_warn (cfile,
"empty shared-network decl");
shared_network_dereference (&share, MDL);
return;
} else if (token == END_OF_FILE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
parse_warn (cfile, "unexpected end of file");
break;
} else if (token == INTERFACE) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
token = next_token (&val, (unsigned *)0, cfile);
new_shared_network_interface (cfile, share, val);
if (!parse_semi (cfile))
do {
token = peek_token(&val, NULL, cfile);
if (token == RBRACE) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
break;
} else if (token == END_OF_FILE) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
parse_warn (cfile, "unexpected end of file");
break;
} else if (token == INTERFACE) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
token = next_token(&val, NULL, cfile);
new_shared_network_interface(cfile, share, val);
if (!parse_semi(cfile))
token = peek_token(&val, NULL, cfile);
if (is_identifier (token) || token == STRING) {
- next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
name = dmalloc(strlen(val) + 1, MDL);
if (!name)
do {
token = peek_token(&val, NULL, cfile);
if (token == RBRACE) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
break;
} else if (token == END_OF_FILE) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
parse_warn(cfile, "unexpected end of file");
break;
} else if (token == TOKEN_DELETED) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
parse_semi(cfile);
deletedp = 1;
} else if (token == DYNAMIC) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
parse_semi(cfile);
dynamicp = 1;
} else if (token == STATIC) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
parse_semi(cfile);
staticp = 1;
}
token = peek_token (&val, (unsigned *)0, cfile);
if (token == STRING) {
unsigned char *tuid;
- token = next_token (&val, &buflen, cfile);
+ skip_token(&val, &buflen, cfile);
if (buflen < sizeof lease -> uid_buf) {
tuid = lease -> uid_buf;
lease -> uid_max =
token = peek_token(&val, NULL, cfile);
if (token == STRING) {
- token = next_token(&val, &buflen, cfile);
+ skip_token(&val, &buflen, cfile);
value->type = binding_data;
value->value.data.len = buflen;
dfree (s, MDL);
}
} else if (token == PERCENT) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
token = next_token(&val, NULL, cfile);
if (token != NUMBER) {
parse_warn(cfile, "expecting decimal number.");
if ((token = peek_token (&val,
(unsigned *)0, cfile)) == DYNAMIC_BOOTP) {
- token = next_token (&val, (unsigned *)0, cfile);
+ skip_token(&val, (unsigned *)0, cfile);
dynamic = 1;
}
/*
* '/' means CIDR notation, so read the bits we want.
*/
- next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
token = next_token(&val, NULL, cfile);
if (token != NUMBER) {
parse_warn(cfile, "expecting number");
parse_warn(cfile, "temporary mask too short");
if (bits == 128)
parse_warn(cfile, "temporary singleton?");
- token = next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
type = D6O_IA_TA;
}
* temporary (RFC 4941)
*/
type = D6O_IA_TA;
- next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
bits = 64;
if (!is_cidr_mask_valid(&lo, bits)) {
parse_warn(cfile, "network mask too short");
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
*/
token = peek_token(&val, NULL, cfile);
if (token == SEMI) {
- token = next_token(&val, NULL, cfile);
+ skip_token(&val, NULL, cfile);
} else {
parse_warn(cfile,
"corrupt lease file; "
/*
* Consume the SERVER_DUID token.
*/
- token = next_token(NULL, NULL, cfile);
+ skip_token(NULL, NULL, cfile);
/*
* Obtain the DUID type.