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

📄 clparse.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		token = next_token (&val, (unsigned *)0, cfile);		parse_string_list (cfile, &config -> media, 1);		return;	      case HARDWARE:		token = next_token (&val, (unsigned *)0, cfile);		if (ip) {			parse_hardware_param (cfile, &ip -> hw_address);		} else {			parse_warn (cfile, "hardware address parameter %s",				    "not allowed here.");			skip_to_semi (cfile);		}		return;	      case REQUEST:		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, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> timeout);		return;	      case RETRY:		token = next_token (&val, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> retry_interval);		return;	      case SELECT_TIMEOUT:		token = next_token (&val, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> select_interval);		return;	      case OMAPI:		token = next_token (&val, (unsigned *)0, 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, (unsigned *)0, cfile);		if (token != NUMBER) {			parse_warn (cfile, "invalid port number: `%s'", val);			skip_to_semi (cfile);			return;		}		tmp = atoi (val);		if (tmp < 0 || tmp > 65535)			parse_warn (cfile, "invalid omapi port %d.", tmp);		else if (config != &top_level_config)			parse_warn (cfile,				    "omapi port only works at top level.");		else			config -> omapi_port = tmp;		parse_semi (cfile);		return;			      case DO_FORWARD_UPDATE:		token = next_token (&val, (unsigned *)0, cfile);		token = next_token (&val, (unsigned *)0, cfile);		if (!strcasecmp (val, "on") ||		    !strcasecmp (val, "true"))			config -> do_forward_update = 1;		else if (!strcasecmp (val, "off") ||			 !strcasecmp (val, "false"))			config -> do_forward_update = 0;		else {			parse_warn (cfile, "expecting boolean value.");			skip_to_semi (cfile);			return;		}		parse_semi (cfile);		return;	      case REBOOT:		token = next_token (&val, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> reboot_timeout);		return;	      case BACKOFF_CUTOFF:		token = next_token (&val, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> backoff_cutoff);		return;	      case INITIAL_INTERVAL:		token = next_token (&val, (unsigned *)0, cfile);		parse_lease_time (cfile, &config -> initial_interval);		return;	      case SCRIPT:		token = next_token (&val, (unsigned *)0, cfile);		parse_string (cfile, &config -> script_name, (unsigned *)0);		return;	      case VENDOR:		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, (unsigned *)0, cfile);		if (token != SPACE) {			parse_warn (cfile, "expecting 'vendor option space'");			skip_to_semi (cfile);			return;		}		token = next_token (&val, (unsigned *)0, cfile);		if (!is_identifier (token)) {			parse_warn (cfile, "expecting an identifier.");			skip_to_semi (cfile);			return;		}		config -> vendor_space_name = dmalloc (strlen (val) + 1, MDL);		if (!config -> vendor_space_name)			log_fatal ("no memory for vendor option space name.");		strcpy (config -> vendor_space_name, val);		for (i = 0; i < universe_count; i++)			if (!strcmp (universes [i] -> name,				     config -> vendor_space_name))				break;		if (i == universe_count) {			log_error ("vendor option space %s not found.",				   config -> vendor_space_name);		}		parse_semi (cfile);		return;	      case INTERFACE:		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, (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");		strcpy (name, val);		parse_interface_declaration (cfile, config, name);		return;			      case LEASE:		token = next_token (&val, (unsigned *)0, cfile);		parse_client_lease_statement (cfile, 1);		return;	      case ALIAS:		token = next_token (&val, (unsigned *)0, cfile);		parse_client_lease_statement (cfile, 2);		return;	      case REJECT:		token = next_token (&val, (unsigned *)0, cfile);		parse_reject_statement (cfile, config);		return;	      default:		lose = 0;		stmt = (struct executable_statement *)0;		if (!parse_executable_statement (&stmt,						 cfile, &lose, context_any)) {			if (!lose) {				parse_warn (cfile, "expecting a statement.");				skip_to_semi (cfile);			}		} else {			struct executable_statement **eptr, *sptr;			if (stmt &&			    (stmt -> op == send_option_statement ||			     (stmt -> op == on_statement &&			      (stmt -> data.on.evtypes & ON_TRANSMISSION)))) {			    eptr = &config -> on_transmission -> statements;			    if (stmt -> op == on_statement) {				    sptr = (struct executable_statement *)0;				    executable_statement_reference					    (&sptr,					     stmt -> data.on.statements, MDL);				    executable_statement_dereference (&stmt,								      MDL);				    executable_statement_reference (&stmt,								    sptr,								    MDL);				    executable_statement_dereference (&sptr,								      MDL);			    }			} else			    eptr = &config -> on_receipt -> statements;			if (stmt) {				for (; *eptr; eptr = &(*eptr) -> next)					;				executable_statement_reference (eptr,								stmt, MDL);			}			return;		}		break;	}	parse_semi (cfile);}/* option-list :== option_name |   		   option_list COMMA option_name */void parse_option_list (cfile, list)	struct parse *cfile;	u_int32_t **list;{	int ix;	int token;	const char *val;	pair p = (pair)0, q, r;	struct option *option;	ix = 0;	do {		token = peek_token (&val, (unsigned *)0, cfile);		if (token == SEMI) {			token = next_token (&val, (unsigned *)0, cfile);			break;		}		if (!is_identifier (token)) {			parse_warn (cfile, "%s: expected option name.", val);			token = next_token (&val, (unsigned *)0, cfile);			skip_to_semi (cfile);			return;		}		option = parse_option_name (cfile, 0, NULL);		if (!option) {			parse_warn (cfile, "%s: expected option name.", val);			return;		}		if (option -> universe != &dhcp_universe) {			parse_warn (cfile,				"%s.%s: Only global options allowed.",				option -> universe -> name, option->name );			skip_to_semi (cfile);			return;		}		r = new_pair (MDL);		if (!r)			log_fatal ("can't allocate pair for option code.");		r -> car = (caddr_t)(long)option -> code;		r -> cdr = (pair)0;		if (p)			q -> cdr = r;		else			p = r;		q = r;		++ix;		token = next_token (&val, (unsigned *)0, cfile);	} while (token == COMMA);	if (token != SEMI) {		parse_warn (cfile, "expecting semicolon.");		skip_to_semi (cfile);		return;	}	/* XXX we can't free the list here, because we may have copied	   XXX it from an outer config state. */	*list = (u_int32_t *)0;	if (ix) {		*list = dmalloc ((ix + 1) * sizeof **list, MDL);		if (!*list)			log_error ("no memory for option list.");		else {			ix = 0;			for (q = p; q; q = q -> cdr)				(*list) [ix++] = (u_int32_t)(long)q -> car;			(*list) [ix] = 0;		}		while (p) {			q = p -> cdr;			free_pair (p, MDL);			p = q;		}	}}/* interface-declaration :==   	INTERFACE string LBRACE client-declarations RBRACE */void parse_interface_declaration (cfile, outer_config, name)	struct parse *cfile;	struct client_config *outer_config;	char *name;{	int token;	const char *val;	struct client_state *client, **cp;	struct interface_info *ip = (struct interface_info *)0;	token = next_token (&val, (unsigned *)0, cfile);	if (token != STRING) {		parse_warn (cfile, "expecting interface name (in quotes).");		skip_to_semi (cfile);		return;	}	if (!interface_or_dummy (&ip, val))		log_fatal ("Can't allocate interface %s.", val);	/* If we were given a name, this is a pseudo-interface. */	if (name) {		make_client_state (&client);		client -> name = name;		client -> interface = ip;		for (cp = &ip -> client; *cp; cp = &((*cp) -> next))			;		*cp = client;	} else {		if (!ip -> client) {			make_client_state (&ip -> client);			ip -> client -> interface = ip;		}		client = ip -> client;	}	if (!client -> config)		make_client_config (client, outer_config);	ip -> flags &= ~INTERFACE_AUTOMATIC;	interfaces_requested = 1;	token = next_token (&val, (unsigned *)0, cfile);	if (token != LBRACE) {		parse_warn (cfile, "expecting left brace.");		skip_to_semi (cfile);		return;	}	do {		token = peek_token (&val, (unsigned *)0, cfile);		if (token == END_OF_FILE) {			parse_warn (cfile,				    "unterminated interface declaration.");			return;		}		if (token == RBRACE)			break;		parse_client_statement (cfile, ip, client -> config);	} while (1);	token = next_token (&val, (unsigned *)0, cfile);}int interface_or_dummy (struct interface_info **pi, const char *name){	struct interface_info *i;	struct interface_info *ip = (struct interface_info *)0;	isc_result_t status;	/* Find the interface (if any) that matches the name. */	for (i = interfaces; i; i = i -> next) {		if (!strcmp (i -> name, name)) {			interface_reference (&ip, i, MDL);			break;		}	}	/* If it's not a real interface, see if it's on the dummy list. */	if (!ip) {		for (ip = dummy_interfaces; ip; ip = ip -> next) {			if (!strcmp (ip -> name, name)) {				interface_reference (&ip, i, MDL);				break;			}		}	}	/* If we didn't find an interface, make a dummy interface as	   a placeholder. */	if (!ip) {		isc_result_t status;		status = interface_allocate (&ip, MDL);		if (status != ISC_R_SUCCESS)			log_fatal ("Can't record interface %s: %s",				   name, isc_result_totext (status));		strcpy (ip -> name, name);		if (dummy_interfaces) {			interface_reference (&ip -> next,					     dummy_interfaces, MDL);

⌨️ 快捷键说明

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