⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 confpars.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -