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

📄 tree.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			  case binding_dns:#if defined (NSUPDATE)			    /* XXX This should be a comparison for equal			       XXX values, not for identity. */			    if (bv -> value.dns == obv -> value.dns)				*result = expr -> op == expr_equal;			    else				*result = expr -> op == expr_not_equal;#else				*result = expr -> op == expr_not_equal;#endif			    break;			  case binding_function:			    if (bv -> value.fundef == obv -> value.fundef)				*result = expr -> op == expr_equal;			    else				*result = expr -> op == expr_not_equal;			    break;			  default:			    *result = expr -> op == expr_not_equal;			    break;			}		    }		} else if (!sleft && !sright)		    *result = expr -> op == expr_equal;		else		    *result = expr -> op == expr_not_equal;#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: %sequal = %s",			   expr -> op == expr_not_equal ? "not" : "",			   (*result ? "true" : "false"));#endif		if (sleft)			binding_value_dereference (&bv, MDL);		if (sright)			binding_value_dereference (&obv, MDL);		return 1;	      case expr_and:		sleft = evaluate_boolean_expression (&bleft, packet, lease,						     client_state,						     in_options, cfg_options,						     scope,						     expr -> data.and [0]);		if (sleft && bleft)			sright = evaluate_boolean_expression				(&bright, packet, lease, client_state,				 in_options, cfg_options,				 scope, expr -> data.and [1]);		else			sright = bright = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: and (%s, %s) = %s",		      sleft ? (bleft ? "true" : "false") : "NULL",		      sright ? (bright ? "true" : "false") : "NULL",		      ((sleft && sright)		       ? (bleft && bright ? "true" : "false") : "NULL"));#endif		if (sleft && sright) {			*result = bleft && bright;			return 1;		}		return 0;	      case expr_or:		bleft = bright = 0;		sleft = evaluate_boolean_expression (&bleft, packet, lease,						     client_state,						     in_options, cfg_options,						     scope,						     expr -> data.or [0]);		if (!sleft || !bleft)			sright = evaluate_boolean_expression				(&bright, packet, lease, client_state,				 in_options, cfg_options,				 scope, expr -> data.or [1]);		else			sright = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: or (%s, %s) = %s",		      sleft ? (bleft ? "true" : "false") : "NULL",		      sright ? (bright ? "true" : "false") : "NULL",		      ((sleft || sright)		       ? (bleft || bright ? "true" : "false") : "NULL"));#endif		if (sleft || sright) {			*result = bleft || bright;			return 1;		}		return 0;	      case expr_not:		sleft = evaluate_boolean_expression (&bleft, packet, lease,						     client_state,						     in_options, cfg_options,						     scope,						     expr -> data.not);#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: not (%s) = %s",		      sleft ? (bleft ? "true" : "false") : "NULL",		      ((sleft && sright)		       ? (!bleft ? "true" : "false") : "NULL"));#endif		if (sleft) {			*result = !bleft;			return 1;		}		return 0;	      case expr_exists:		memset (&left, 0, sizeof left);		if (!in_options ||		    !get_option (&left, expr -> data.exists -> universe,				 packet, lease, client_state,				 in_options, cfg_options, in_options,				 scope, expr -> data.exists -> code, MDL))			*result = 0;		else {			*result = 1;			data_string_forget (&left, MDL);		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: exists %s.%s = %s",			   expr -> data.option -> universe -> name,			   expr -> data.option -> name,			   *result ? "true" : "false");#endif		return 1;	      case expr_known:		if (!packet) {#if defined (DEBUG_EXPRESSIONS)			log_debug ("bool: known = NULL");#endif			return 0;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: known = %s",			  packet -> known ? "true" : "false");#endif		*result = packet -> known;		return 1;	      case expr_static:		if (!lease || !(lease -> flags & STATIC_LEASE)) {#if defined (DEBUG_EXPRESSIONS)			log_debug ("bool: static = false (%s %s %s %d)",				   lease ? "y" : "n",				   (lease && (lease -> flags & STATIC_LEASE)				    ? "y" : "n"),				   piaddr (lease -> ip_addr),				   lease ? lease -> flags : 0);#endif			*result = 0;			return 1;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("bool: static = true");#endif		*result = 1;		return 1;	      case expr_variable_exists:		if (scope && *scope) {			binding = find_binding (*scope, expr -> data.variable);			if (binding) {				if (binding -> value)					*result = 1;				else					*result = 0;			} else				*result = 0;		} else			*result = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("boolean: %s? = %s", expr -> data.variable,			   *result ? "true" : "false");#endif		return 1;	      case expr_variable_reference:		if (scope && *scope) {		    binding = find_binding (*scope, expr -> data.variable);		    if (binding && binding -> value) {			if (binding -> value -> type ==			    binding_boolean) {				*result = binding -> value -> value.boolean;				sleft = 1;			} else {				log_error ("binding type %d in %s.",					   binding -> value -> type,					   "evaluate_boolean_expression");				sleft = 0;			}		    } else			    sleft = 0;		} else			sleft = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("boolean: %s = %s", expr -> data.variable,			   sleft ? (*result ? "true" : "false") : "NULL");#endif		return sleft;	      case expr_funcall:		bv = (struct binding_value *)0;		sleft = evaluate_expression (&bv, packet, lease, client_state,					  in_options, cfg_options,					  scope, expr, MDL);		if (sleft) {			if (bv -> type != binding_boolean)				log_error ("%s() returned type %d in %s.",					   expr -> data.funcall.name,					   bv -> type,					   "evaluate_boolean_expression");			else				*result = bv -> value.boolean;			binding_value_dereference (&bv, MDL);		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("boolean: %s() = %s", expr -> data.funcall.name,			   sleft ? (*result ? "true" : "false") : "NULL");#endif		break;	      case expr_none:	      case expr_match:	      case expr_substring:	      case expr_suffix:	      case expr_option:	      case expr_hardware:	      case expr_const_data:	      case expr_packet:	      case expr_concat:	      case expr_encapsulate:	      case expr_host_lookup:	      case expr_encode_int8:	      case expr_encode_int16:	      case expr_encode_int32:	      case expr_binary_to_ascii:	      case expr_reverse:	      case expr_pick_first_value:	      case expr_host_decl_name:	      case expr_config_option:	      case expr_leased_address:	      case expr_null:	      case expr_filename:	      case expr_sname:		log_error ("Data opcode in evaluate_boolean_expression: %d",		      expr -> op);		return 0;	      case expr_extract_int8:	      case expr_extract_int16:	      case expr_extract_int32:	      case expr_const_int:	      case expr_lease_time:	      case expr_dns_transaction:	      case expr_add:	      case expr_subtract:	      case expr_multiply:	      case expr_divide:	      case expr_remainder:	      case expr_binary_and:	      case expr_binary_or:	      case expr_binary_xor:	      case expr_client_state:		log_error ("Numeric opcode in evaluate_boolean_expression: %d",		      expr -> op);		return 0;	      case expr_ns_add:	      case expr_ns_delete:	      case expr_ns_exists:	      case expr_ns_not_exists:		log_error ("dns opcode in evaluate_boolean_expression: %d",		      expr -> op);		return 0;	      case expr_function:		log_error ("function definition in evaluate_boolean_expr");		return 0;	      case expr_arg:		break;	}	log_error ("Bogus opcode in evaluate_boolean_expression: %d",		   expr -> op);	return 0;}int evaluate_data_expression (result, packet, lease, client_state,			      in_options, cfg_options, scope, expr, file, line)	struct data_string *result;	struct packet *packet;	struct lease *lease;	struct client_state *client_state;	struct option_state *in_options;	struct option_state *cfg_options;	struct binding_scope **scope;	struct expression *expr;	const char *file;	int line;{	struct data_string data, other;	unsigned long offset, len, i;	int s0, s1, s2, s3;	int status;	struct binding *binding;	char *s;	struct binding_value *bv;	switch (expr -> op) {		/* Extract N bytes starting at byte M of a data string. */	      case expr_substring:		memset (&data, 0, sizeof data);		s0 = evaluate_data_expression (&data, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.substring.expr,					       MDL);		/* Evaluate the offset and length. */		s1 = evaluate_numeric_expression			(&offset, packet, lease, client_state, in_options,			 cfg_options, scope, expr -> data.substring.offset);		s2 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.substring.len);		if (s0 && s1 && s2) {			/* If the offset is after end of the string,			   return an empty string.  Otherwise, do the			   adjustments and return what's left. */			if (data.len > offset) {				data_string_copy (result, &data, file, line);				result -> len -= offset;				if (result -> len > len) {					result -> len = len;					result -> terminated = 0;				}				result -> data += offset;			}			s3 = 1;		} else			s3 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: substring (%s, %s, %s) = %s",		      s0 ? print_hex_1 (data.len, data.data, 30) : "NULL",		      s1 ? print_dec_1 (offset) : "NULL",		      s2 ? print_dec_2 (len) : "NULL",		      (s3 ? print_hex_2 (result -> len, result -> data, 30)		          : "NULL"));#endif		if (s0)			data_string_forget (&data, MDL);		if (s3)			return 1;		return 0;		/* Extract the last N bytes of a data string. */	      case expr_suffix:		memset (&data, 0, sizeof data);		s0 = evaluate_data_expression (&data, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.suffix.expr, MDL);		/* Evaluate the length. */		s1 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.suffix.len);		if (s0 && s1) {			data_string_copy (result, &data, file, line);			/* If we are returning the last N bytes of a			   string whose length is <= N, just return			   the string - otherwise, compute a new			   starting address and decrease the			   length. */			if (data.len > len) {				result -> data += data.len - len;				result -> len = len;			}			data_string_forget (&data, MDL);		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: suffix (%s, %s) = %s",		      s0 ? print_hex_1 (data.len, data.data, 30) : "NULL",		      s1 ? print_dec_1 (len) : "NULL",		      ((s0 && s1)		       ? print_hex_2 (result -> len, result -> data, 30)		       : "NULL"));#endif		return s0 && s1;		/* Extract an option. */	      case expr_option:		if (in_options)		    s0 = get_option (result,				     expr -> data.option -> universe,				     packet, lease, client_state,				     in_options, cfg_options, in_options,				     scope, expr -> data.option -> code,				     file, line);		else			s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: option %s.%s = %s",		      expr -> data.option -> universe -> name,		      expr -> data.option -> name,		      s0 ? print_hex_1 (result -> len, result -> data, 60)		      : "NULL");#endif		return s0;	      case expr_config_option:		if (cfg_options)		    s0 = get_option (result,				     expr -> data.option -> universe,				     packet, lease, client_state,				     in_options, cfg_options, cfg_options,				     scope, expr -> data.option -> code,				     file, line);		else			s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: config-option %s.%s = %s",		      expr -> data.option -> universe -> name,		      expr -> data.option -> name,		      s0 ? print_hex_1 (result -> len, result -> data, 60)		      : "NULL");#endif		return s0;		/* Combine the hardware type and address. */	      case expr_hardware:		/* On the client, hardware is our hardware. */		if (client_state) {			memset (result, 0, sizeof *result);			result -> data =				client_state -> interface -> hw_address.hbuf;			result -> len =				client_state -> interface -> hw_address.hlen;#if defined (DEBUG_EXPRESSIONS)			log_debug ("data: hardware = %s",				   print_hex_1 (result -> len,						result -> data, 60));#endif			return 1;		}		/* The server cares about the client's hardware address,		   so only in the case where we are examining a packet can		   we return anything. */		if (!packet || !packet -> raw) {			log_error ("data: hardware: raw packet not available");			return 0;		}		if (packet -> raw -> hlen > sizeof packet -> raw -> chaddr) {			log_error ("data: hardware: invalid hlen (%d)\n",				   packet -> raw -> hlen);			return 0;		}		result -> len = packet -> raw -> hlen + 1;

⌨️ 快捷键说明

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