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

📄 confpars.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			parse_warn (cfile,				    "class declarations not allowed here.");			skip_to_semi (cfile);			break;		}		parse_class_declaration ((struct class **)0, cfile, group, 3);		return 1;	      case HARDWARE:		next_token (&val, (unsigned *)0, cfile);		memset (&hardware, 0, sizeof hardware);		parse_hardware_param (cfile, &hardware);		if (host_decl)			host_decl -> interface = hardware;		else			parse_warn (cfile, "hardware address parameter %s",				    "not allowed here.");		break;	      case FIXED_ADDR:		next_token (&val, (unsigned *)0, cfile);		cache = (struct option_cache *)0;		if (parse_fixed_addr_param (&cache, cfile)) {			if (host_decl) {				if (host_decl -> fixed_addr) {					option_cache_dereference (&cache, MDL);					parse_warn (cfile,						    "Only one fixed address%s",						    " declaration per host.");				} else {					host_decl -> fixed_addr = cache;				}			} else {				parse_warn (cfile,					    "fixed-address parameter not %s",					    "allowed here.");				option_cache_dereference (&cache, MDL);			}		}		break;	      case POOL:		next_token (&val, (unsigned *)0, cfile);		if (type != SUBNET_DECL && type != SHARED_NET_DECL) {			parse_warn (cfile, "pool declared outside of network");		}		if (type == POOL_DECL) {			parse_warn (cfile, "pool declared within pool.");		}		parse_pool_statement (cfile, group, type);		return declaration;	      case RANGE:		next_token (&val, (unsigned *)0, cfile);		if (type != SUBNET_DECL || !group -> subnet) {			parse_warn (cfile,				    "range declaration not allowed here.");			skip_to_semi (cfile);			return declaration;		}		parse_address_range (cfile, group, type, (struct pool *)0,				     (struct lease **)0);		return declaration;	      case TOKEN_NOT:		token = next_token (&val, (unsigned *)0, cfile);		token = next_token (&val, (unsigned *)0, cfile);		switch (token) {		      case AUTHORITATIVE:			group -> authoritative = 0;			goto authoritative;		      default:			parse_warn (cfile, "expecting assertion");			skip_to_semi (cfile);			break;		}		break;	      case AUTHORITATIVE:		token = next_token (&val, (unsigned *)0, cfile);		group -> authoritative = 1;	      authoritative:		if (type == HOST_DECL)			parse_warn (cfile, "authority makes no sense here."); 		parse_semi (cfile);		break;		/* "server-identifier" is a special hack, equivalent to		   "option dhcp-server-identifier". */	      case SERVER_IDENTIFIER:		option = dhcp_universe.options [DHO_DHCP_SERVER_IDENTIFIER];		token = next_token (&val, (unsigned *)0, cfile);		goto finish_option;	      case OPTION:		token = next_token (&val, (unsigned *)0, cfile);		token = peek_token (&val, (unsigned *)0, cfile);		if (token == SPACE) {			if (type != ROOT_GROUP) {				parse_warn (cfile,					    "option space definitions %s",					    "may not be scoped.");				skip_to_semi (cfile);				break;			}			parse_option_space_decl (cfile);			return declaration;		}		known = 0;		option = parse_option_name (cfile, 1, &known);		if (option) {			token = peek_token (&val, (unsigned *)0, cfile);			if (token == CODE) {				if (type != ROOT_GROUP) {					parse_warn (cfile,						    "option definitions%s",						    " may not be scoped.");					skip_to_semi (cfile);					free_option (option, MDL);					break;				}				next_token (&val, (unsigned *)0, cfile);				if (!parse_option_code_definition (cfile,								   option))					free_option (option, MDL);				return declaration;			}			/* If this wasn't an option code definition, don't			   allow an unknown option. */			if (!known) {				parse_warn (cfile, "unknown option %s.%s",					    option -> universe -> name,					    option -> name);				skip_to_semi (cfile);				free_option (option, MDL);				return declaration;			}		      finish_option:			et = (struct executable_statement *)0;			if (!parse_option_statement				(&et, cfile, 1, option,				 supersede_option_statement))				return declaration;			goto insert_statement;		} else			return declaration;		break;	      case FAILOVER:		if (type != ROOT_GROUP && type != SHARED_NET_DECL) {			parse_warn (cfile, "failover peers may only be %s",				    "defined in shared-network");			log_error ("declarations and the outer scope.");			skip_to_semi (cfile);			break;		}		token = next_token (&val, (unsigned *)0, cfile);#if defined (FAILOVER_PROTOCOL)		parse_failover_peer (cfile, group, type);#else		parse_warn (cfile, "No failover support.");		skip_to_semi (cfile);#endif		break;	      default:		et = (struct executable_statement *)0;		lose = 0;		if (!parse_executable_statement (&et, cfile, &lose,						 context_any)) {			if (!lose) {				if (declaration)					parse_warn (cfile,						    "expecting a declaration");				else					parse_warn (cfile,						    "expecting a parameter %s",						    "or declaration");				skip_to_semi (cfile);			}			return declaration;		}		if (!et)			return declaration;	      insert_statement:		if (group -> statements) {			int multi = 0;			/* If this set of statements is only referenced			   by this group, just add the current statement			   to the end of the chain. */			for (ep = group -> statements; ep -> next;			     ep = ep -> next)				if (ep -> refcnt > 1) /* XXX */					multi = 1;			if (!multi) {				executable_statement_reference (&ep -> next,								et, MDL);				executable_statement_dereference (&et, MDL);				return declaration;			}			/* Otherwise, make a parent chain, and put the			   current group statements first and the new			   statement in the next pointer. */			ep = (struct executable_statement *)0;			if (!executable_statement_allocate (&ep, MDL))				log_fatal ("No memory for statements.");			ep -> op = statements_statement;			executable_statement_reference (&ep -> data.statements,							group -> statements,							MDL);			executable_statement_reference (&ep -> next, et, MDL);			executable_statement_dereference (&group -> statements,							  MDL);			executable_statement_reference (&group -> statements,							ep, MDL);			executable_statement_dereference (&ep, MDL);		} else {			executable_statement_reference (&group -> statements,							et, MDL);		}		executable_statement_dereference (&et, MDL);		return declaration;	}	return 0;}#if defined (FAILOVER_PROTOCOL)void parse_failover_peer (cfile, group, type)	struct parse *cfile;	struct group *group;	int type;{	enum dhcp_token token;	const char *val;	dhcp_failover_state_t *peer;	u_int32_t *tp;	char *name;	u_int32_t split;	u_int8_t hba [32];	unsigned hba_len = sizeof hba;	int i;	struct expression *expr;	isc_result_t status;	dhcp_failover_config_t *cp;	token = next_token (&val, (unsigned *)0, cfile);	if (token != PEER) {		parse_warn (cfile, "expecting \"peer\"");		skip_to_semi (cfile);		return;	}	token = next_token (&val, (unsigned *)0, cfile);	if (is_identifier (token) || token == STRING) {		name = dmalloc (strlen (val) + 1, MDL);		if (!name)			log_fatal ("no memory for peer name %s", name);		strcpy (name, val);	} else {		parse_warn (cfile, "expecting failover peer name.");		skip_to_semi (cfile);		return;	}	/* See if there's a peer declaration by this name. */	peer = (dhcp_failover_state_t *)0;	find_failover_peer (&peer, name, MDL);	token = next_token (&val, (unsigned *)0, cfile);	if (token == SEMI) {		dfree (name, MDL);		if (type != SHARED_NET_DECL)			parse_warn (cfile, "failover peer reference not %s",				    "in shared-network declaration");		else {			if (!peer) {				parse_warn (cfile, "reference to unknown%s%s",					    " failover peer ", name);				return;			}			dhcp_failover_state_reference				(&group -> shared_network -> failover_peer,				 peer, MDL);		}		dhcp_failover_state_dereference (&peer, MDL);		return;	} else if (token == STATE) {		if (!peer) {			parse_warn (cfile, "state declaration for unknown%s%s",				    " failover peer ", name);			return;		}		parse_failover_state_declaration (cfile, peer);		dhcp_failover_state_dereference (&peer, MDL);		return;	} else if (token != LBRACE) {		parse_warn (cfile, "expecting left brace");		skip_to_semi (cfile);	}	/* Make sure this isn't a redeclaration. */	if (peer) {		parse_warn (cfile, "redeclaration of failover peer %s", name);		skip_to_rbrace (cfile, 1);		dhcp_failover_state_dereference (&peer, MDL);		return;	}	status = dhcp_failover_state_allocate (&peer, MDL);	if (status != ISC_R_SUCCESS)		log_fatal ("Can't allocate failover peer %s: %s",			   name, isc_result_totext (status));	/* Save the name. */	peer -> name = name;	do {		cp = &peer -> me;	      peer:		token = next_token (&val, (unsigned *)0, cfile);		switch (token) {		      case RBRACE:			break;		      case PRIMARY:			peer -> i_am = primary;			break;		      case SECONDARY:			peer -> i_am = secondary;			if (peer -> hba)				parse_warn (cfile,					    "secondary may not define %s",					    "load balance settings.");			break;		      case PEER:			cp = &peer -> partner;			goto peer;		      case ADDRESS:			expr = (struct expression *)0;			if (!parse_ip_addr_or_hostname (&expr, cfile, 0)) {				skip_to_rbrace (cfile, 1);				dhcp_failover_state_dereference (&peer, MDL);				return;			}			option_cache (&cp -> address,				      (struct data_string *)0, expr,				      (struct option *)0, MDL);			expression_dereference (&expr, MDL);			break;		      case PORT:			token = next_token (&val, (unsigned *)0, cfile);			if (token != NUMBER) {				parse_warn (cfile, "expecting number");				skip_to_rbrace (cfile, 1);			}			cp -> port = atoi (val);			break;		      case MAX_RESPONSE_DELAY:			tp = &cp -> max_response_delay;		      parse_idle:			token = next_token (&val, (unsigned *)0, cfile);			if (token != NUMBER) {				parse_warn (cfile, "expecting number.");				skip_to_rbrace (cfile, 1);				dhcp_failover_state_dereference (&peer, MDL);				return;			}			*tp = atoi (val);			break;		      case MAX_UNACKED_UPDATES:			tp = &cp -> max_flying_updates;			goto parse_idle;		      case MCLT:			tp = &peer -> mclt;			goto parse_idle;		      case HBA:			hba_len = 32;			if (peer -> i_am == secondary)				parse_warn (cfile,					    "secondary may not define %s",					    "load balance settings.");			if (!parse_numeric_aggregate (cfile, hba, &hba_len,						      COLON, 16, 8)) {				skip_to_rbrace (cfile, 1);				dhcp_failover_state_dereference (&peer, MDL);				return;			}			if (hba_len != 32) {				parse_warn (cfile,					    "HBA must be exactly 32 bytes.");				dfree (hba, MDL);				break;			}		      make_hba:			peer -> hba = dmalloc (32, MDL);			if (!peer -> hba) {				dfree (peer -> name, MDL);				dfree (peer, MDL);			}			memcpy (peer -> hba, hba, 32);			break;		      case SPLIT:			token = next_token (&val, (unsigned *)0, cfile);			if (peer -> i_am == secondary)				parse_warn (cfile,					    "secondary may not define %s",					    "load balance settings.");			if (token != NUMBER) {				parse_warn (cfile, "expecting number");			      badsplit:				skip_to_rbrace (cfile, 1);				dhcp_failover_state_dereference (&peer, MDL);				return;			}			split = atoi (val);			if (split > 255) {				parse_warn (cfile, "split must be < 256");			} else {				memset (hba, 0, sizeof hba);				for (i = 0; i < split; i++) {					if (i < split)						hba [i / 8] |= (1 << (i & 7));				}				goto make_hba;			}			break;					      case LOAD:			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, (unsigned *)0, cfile);			if (token != TOKEN_MAX) {				parse_warn (cfile, "expecting 'max'");				goto badload;			}			token = next_token (&val, (unsigned *)0, cfile);			if (token != SECONDS) {				parse_warn (cfile, "expecting 'secs'");				goto badload;			}			token = next_token (&val, (unsigned *)0, cfile);			if (token != NUMBER) {				parse_warn (cfile, "expecting number");				goto badload;			}			peer -> load_balance_max_secs = atoi (val);			break;					      default:			parse_warn (cfile,				    "invalid statement in peer declaration");			skip_to_rbrace (cfile, 1);			dhcp_failover_state_dereference (&peer, MDL);			return;		}		if (token != RBRACE && !parse_semi (cfile)) {			skip_to_rbrace (cfile, 1);			dhcp_failover_state_dereference (&peer, MDL);			return;		}	} while (token != RBRACE);	/* me.address can be null; the failover link initiate code tries to	 * derive a reasonable address to use.	 */	if (!peer -> partner.address)		parse_warn (cfile, "peer address may not be omitted");	/* XXX - when/if we get a port number assigned, just set as default */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -