📄 confpars.c
字号:
data_string_forget (&data, MDL); /* Spawned classes don't have to have their own settings. */ if (class -> superclass) { token = peek_token (&val, (unsigned *)0, cfile); if (token == SEMI) { next_token (&val, (unsigned *)0, cfile); if (cp) status = class_reference (cp, class, MDL); class_dereference (&class, MDL); if (pc) class_dereference (&pc, MDL); return cp ? (status == ISC_R_SUCCESS) : 1; } /* Give the subclass its own group. */ if (!clone_group (&class -> group, class -> group, MDL)) log_fatal ("can't clone class group."); } if (!parse_lbrace (cfile)) { class_dereference (&class, MDL); if (pc) class_dereference (&pc, MDL); return 0; } do { token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == MATCH) { if (pc) { parse_warn (cfile, "invalid match in subclass."); skip_to_semi (cfile); break; } token = next_token (&val, (unsigned *)0, cfile); token = peek_token (&val, (unsigned *)0, cfile); if (token != IF) goto submatch; if (class -> expr) { parse_warn (cfile, "can't override match."); skip_to_semi (cfile); break; } token = next_token (&val, (unsigned *)0, cfile); if (!parse_boolean_expression (&class -> expr, cfile, &lose)) { if (!lose) { parse_warn (cfile, "expecting boolean expr."); skip_to_semi (cfile); } } else {#if defined (DEBUG_EXPRESSION_PARSE) print_expression ("class match", class -> expr);#endif parse_semi (cfile); } } else if (token == SPAWN) { if (pc) { parse_warn (cfile, "invalid spawn in subclass."); skip_to_semi (cfile); break; } token = next_token (&val, (unsigned *)0, cfile); class -> spawning = 1; token = next_token (&val, (unsigned *)0, cfile); if (token != WITH) { parse_warn (cfile, "expecting with after spawn"); skip_to_semi (cfile); break; } submatch: if (class -> submatch) { parse_warn (cfile, "can't override existing %s.", "submatch/spawn"); skip_to_semi (cfile); break; } if (!parse_data_expression (&class -> submatch, cfile, &lose)) { if (!lose) { parse_warn (cfile, "expecting data expr."); skip_to_semi (cfile); } } else {#if defined (DEBUG_EXPRESSION_PARSE) print_expression ("class submatch", class -> submatch);#endif parse_semi (cfile); } } else if (token == LEASE) { 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, (unsigned *)0, cfile); if (token != NUMBER) { parse_warn (cfile, "expecting a number"); if (token != SEMI) skip_to_semi (cfile); break; } class -> lease_limit = atoi (val); class -> billed_leases = dmalloc (class -> lease_limit * sizeof (struct lease *), MDL); if (!class -> billed_leases) log_fatal ("no memory for billed leases."); memset (class -> billed_leases, 0, (class -> lease_limit * sizeof class -> billed_leases)); have_billing_classes = 1; parse_semi (cfile); } else { declaration = parse_statement (cfile, class -> group, CLASS_DECL, (struct host_decl *)0, declaration); } } while (1); if (type == 2 && new) { if (!collections -> classes) class_reference (&collections -> classes, class, MDL); else { struct class *c; for (c = collections -> classes; c -> nic; c = c -> nic) ; class_reference (&c -> nic, class, MDL); } } if (cp) status = class_reference (cp, class, MDL); class_dereference (&class, MDL); if (pc) class_dereference (&pc, MDL); return cp ? (status == ISC_R_SUCCESS) : 1;}/* shared-network-declaration :== hostname LBRACE declarations parameters RBRACE */void parse_shared_net_declaration (cfile, group) struct parse *cfile; struct group *group;{ const char *val; enum dhcp_token token; struct shared_network *share; char *name; int declaration = 0; isc_result_t status; share = (struct shared_network *)0; status = shared_network_allocate (&share, MDL); if (status != ISC_R_SUCCESS) log_fatal ("Can't allocate shared subnet: %s", isc_result_totext (status)); clone_group (&share -> group, group, MDL); shared_network_reference (&share -> group -> shared_network, share, MDL); /* Get the name of the shared network... */ token = peek_token (&val, (unsigned *)0, cfile); if (token == STRING) { token = next_token (&val, (unsigned *)0, cfile); if (val [0] == 0) { parse_warn (cfile, "zero-length shared network name"); val = "<no-name-given>"; } name = dmalloc (strlen (val) + 1, MDL); if (!name) log_fatal ("no memory for shared network name"); strcpy (name, val); } else { name = parse_host_name (cfile); if (!name) { parse_warn (cfile, "expecting a name for shared-network"); skip_to_semi (cfile); shared_network_dereference (&share, MDL); return; } } share -> name = name; if (!parse_lbrace (cfile)) { shared_network_dereference (&share, MDL); return; } do { token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { token = next_token (&val, (unsigned *)0, cfile); if (!share -> subnets) parse_warn (cfile, "empty shared-network decl"); else enter_shared_network (share); shared_network_dereference (&share, MDL); return; } else if (token == END_OF_FILE) { token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == INTERFACE) { 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; continue; } declaration = parse_statement (cfile, share -> group, SHARED_NET_DECL, (struct host_decl *)0, declaration); } while (1); shared_network_dereference (&share, MDL);}/* subnet-declaration :== net NETMASK netmask RBRACE parameters declarations LBRACE */void parse_subnet_declaration (cfile, share) struct parse *cfile; struct shared_network *share;{ const char *val; enum dhcp_token token; struct subnet *subnet, *t, *u; struct iaddr iaddr; unsigned char addr [4]; unsigned len = sizeof addr; int declaration = 0; struct interface_info *ip; isc_result_t status; subnet = (struct subnet *)0; status = subnet_allocate (&subnet, MDL); if (status != ISC_R_SUCCESS) log_fatal ("Allocation of new subnet failed: %s", isc_result_totext (status)); shared_network_reference (&subnet -> shared_network, share, MDL); if (!clone_group (&subnet -> group, share -> group, MDL)) log_fatal ("allocation of group for new subnet failed."); subnet_reference (&subnet -> group -> subnet, subnet, MDL); /* Get the network number... */ if (!parse_numeric_aggregate (cfile, addr, &len, DOT, 10, 8)) { subnet_dereference (&subnet, MDL); return; } memcpy (iaddr.iabuf, addr, len); iaddr.len = len; subnet -> net = iaddr; token = next_token (&val, (unsigned *)0, cfile); if (token != NETMASK) { parse_warn (cfile, "Expecting netmask"); skip_to_semi (cfile); return; } /* Get the netmask... */ if (!parse_numeric_aggregate (cfile, addr, &len, DOT, 10, 8)) { subnet_dereference (&subnet, MDL); return; } memcpy (iaddr.iabuf, addr, len); iaddr.len = len; subnet -> netmask = iaddr; /* Validate the network number/netmask pair. */ if (host_addr (subnet -> net, subnet -> netmask)) { char *maskstr; maskstr = strdup (piaddr (subnet -> netmask)); parse_warn (cfile, "subnet %s netmask %s: bad subnet number/mask combination.", piaddr (subnet -> net), maskstr); free(maskstr); subnet_dereference (&subnet, MDL); skip_to_semi (cfile); return; } enter_subnet (subnet); if (!parse_lbrace (cfile)) { subnet_dereference (&subnet, MDL); return; } do { token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == INTERFACE) { 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; continue; } declaration = parse_statement (cfile, subnet -> group, SUBNET_DECL, (struct host_decl *)0, declaration); } while (1); /* Add the subnet to the list of subnets in this shared net. */ if (!share -> subnets) subnet_reference (&share -> subnets, subnet, MDL); else { u = (struct subnet *)0; for (t = share -> subnets; t -> next_sibling; t = t -> next_sibling) { if (subnet_inner_than (subnet, t, 0)) { subnet_reference (&subnet -> next_sibling, t, MDL); if (u) { subnet_dereference (&u -> next_sibling, MDL); subnet_reference (&u -> next_sibling, subnet, MDL); } else { subnet_dereference (&share -> subnets, MDL); subnet_reference (&share -> subnets, subnet, MDL); } subnet_dereference (&subnet, MDL); return; } u = t; } subnet_reference (&t -> next_sibling, subnet, MDL); } subnet_dereference (&subnet, MDL);}/* group-declaration :== RBRACE parameters declarations LBRACE */void parse_group_declaration (cfile, group) struct parse *cfile; struct group *group;{ const char *val; enum dhcp_token token; struct group *g; int declaration = 0; struct group_object *t; isc_result_t status; char *name = NULL; int deletedp = 0; int dynamicp = 0; int staticp = 0; g = (struct group *)0; if (!clone_group (&g, group, MDL)) log_fatal ("no memory for explicit group."); token = peek_token (&val, (unsigned *)0, cfile); if (is_identifier (token) || token == STRING) { next_token (&val, (unsigned *)0, cfile); name = dmalloc (strlen (val) + 1, MDL); if (!name) log_fatal ("no memory for group decl name %s", val); strcpy (name, val); } if (!parse_lbrace (cfile)) { group_dereference (&g, MDL); return; } do { token = peek_token (&val, (unsigned *)0, cfile); if (token == RBRACE) { token = next_token (&val, (unsigned *)0, cfile); break; } else if (token == END_OF_FILE) { token = next_token (&val, (unsigned *)0, cfile); parse_warn (cfile, "unexpected end of file"); break; } else if (token == TOKEN_DELETED) { token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); deletedp = 1; } else if (token == DYNAMIC) { token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); dynamicp = 1; } else if (token == STATIC) { token = next_token (&val, (unsigned *)0, cfile); parse_semi (cfile); staticp = 1; } declaration = parse_statement (cfile, g, GROUP_DECL, (struct host_decl *)0, declaration); } while (1); if (name) { if (deletedp) { if (group_name_hash) { t = (struct group_object *)0; if (group_hash_lookup (&t, group_name_hash, name, strlen (name), MDL)) { delete_group (t, 0); } } } else { t = (struct group_object *)0; status = group_object_allocate (&t, MDL); if (status != ISC_R_SUCCESS) log_fatal ("no memory for group decl %s: %s", val, isc_result_totext (status)); group_reference (&t -> group, g, MDL); t -> name = name; t -> flags = ((staticp ? GROUP_OBJECT_STATIC : 0) | (dynamicp ? GROUP_OBJECT_DYNAMIC : 0) | (deletedp ? GROUP_OBJECT_DELETED : 0)); supersede_group (t, 0); } if (t) group_object_dereference (&t, MDL); }}/* fixed-addr-parameter :== ip-addrs-or-hostnames SEMI ip-addrs-or-hostnames :== ip-addr-or-hostname | ip-addrs-or-hostnames ip-addr-or-hostname */int parse_fixed_addr_param (oc, cfile) struct option_cache **oc; struct parse *cfile;{ const char *val; enum dhcp_token token; struct expression *expr = (struct expression *)0; struct expression *tmp, *new; int status; do { tmp = (struct expression *)0; if (parse_ip_addr_or_hostname (&tmp, cfile, 1)) { if (expr) { new = (struct expression *)0; status = make_concat (&new, expr, tmp); expression_dereference (&expr, MDL); expression_dereference (&tmp, MDL); if (!status) return 0; expr = new; } else expr =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -