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

📄 tree.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	      case expr_host_decl_name:		if (!lease || !lease -> host) {			log_error ("data: host_decl_name: not available");			return 0;		}		result -> len = strlen (lease -> host -> name);		if (buffer_allocate (&result -> buffer,				     result -> len + 1, file, line)) {			result -> data = &result -> buffer -> data [0];			strcpy ((char *)&result -> buffer -> data [0],				lease -> host -> name);			result -> terminated = 1;		} else {			log_error ("data: host-decl-name: no memory.");			return 0;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: host-decl-name = %s", lease -> host -> name);#endif		return 1;	      case expr_null:#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: null = NULL");#endif		return 0;	      case expr_variable_reference:		if (scope && *scope) {		    binding = find_binding (*scope, expr -> data.variable);		    if (binding && binding -> value) {			if (binding -> value -> type == binding_data) {			    data_string_copy (result,					      &binding -> value -> value.data,					      file, line);			    s0 = 1;			} else if (binding -> value -> type != binding_data) {			    log_error ("binding type %d in %s.",				       binding -> value -> type,				       "evaluate_data_expression");			    s0 = 0;			} else			    s0 = 0;		    } else			s0 = 0;		} else		    s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: %s = %s", expr -> data.variable,			   s0 ? print_hex_1 (result -> len,					     result -> data, 50) : "NULL");#endif		return s0;	      case expr_funcall:		bv = (struct binding_value *)0;		s0 = evaluate_expression (&bv, packet, lease, client_state,					  in_options, cfg_options,					  scope, expr, MDL);		if (s0) {			if (bv -> type != binding_data)				log_error ("%s() returned type %d in %s.",					   expr -> data.funcall.name,					   bv -> type,					   "evaluate_data_expression");			else				data_string_copy (result, &bv -> value.data,						  file, line);			binding_value_dereference (&bv, MDL);		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: %s = %s", expr -> data.funcall.name,			   s0 ? print_hex_1 (result -> len,					     result -> data, 50) : "NULL");#endif		break;		/* Extract the filename. */	      case expr_filename:		if (packet && packet -> raw -> file [0]) {			char *fn =				memchr (packet -> raw -> file, 0,					sizeof packet -> raw -> file);			if (!fn)				fn = ((char *)packet -> raw -> file +				      sizeof packet -> raw -> file);			result -> len = fn - &(packet -> raw -> file [0]);			if (buffer_allocate (&result -> buffer,					     result -> len + 1, file, line)) {				result -> data = &result -> buffer -> data [0];				memcpy (&result -> buffer -> data [0],					packet -> raw -> file,					result -> len);				result -> buffer -> data [result -> len] = 0;				result -> terminated = 1;				s0 = 1;			} else {				log_error ("data: filename: no memory.");				s0 = 0;			}		} else			s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_info ("data: filename = \"%s\"",			  s0 ? (const char *)(result -> data) : "NULL");#endif		return s0;		/* Extract the server name. */	      case expr_sname:		if (packet && packet -> raw -> sname [0]) {			char *fn =				memchr (packet -> raw -> sname, 0,					sizeof packet -> raw -> sname);			if (!fn)				fn = ((char *)packet -> raw -> sname + 				      sizeof packet -> raw -> sname);			result -> len = fn - &packet -> raw -> sname [0];			if (buffer_allocate (&result -> buffer,					     result -> len + 1, file, line)) {				result -> data = &result -> buffer -> data [0];				memcpy (&result -> buffer -> data [0],					packet -> raw -> sname,					result -> len);				result -> buffer -> data [result -> len] = 0;				result -> terminated = 1;				s0 = 1;			} else {				log_error ("data: sname: no memory.");				s0 = 0;			}		} else			s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_info ("data: sname = \"%s\"",			  s0 ? (const char *)(result -> data) : "NULL");#endif		return s0;	      case expr_check:	      case expr_equal:	      case expr_not_equal:	      case expr_and:	      case expr_or:	      case expr_not:	      case expr_match:	      case expr_static:	      case expr_known:	      case expr_none:	      case expr_exists:	      case expr_variable_exists:		log_error ("Boolean opcode in evaluate_data_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_data_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 update opcode in evaluate_data_expression: %d",		      expr -> op);		return 0;	      case expr_function:		log_error ("function definition in evaluate_data_expression");		return 0;	      case expr_arg:		break;	}	log_error ("Bogus opcode in evaluate_data_expression: %d", expr -> op);	return 0;}	int evaluate_numeric_expression (result, packet, lease, client_state,				 in_options, cfg_options, scope, expr)	unsigned long *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;{	struct data_string data;	int status, sleft, sright;#if defined (NSUPDATE)	ns_updrec *nut;	ns_updque uq;#endif	struct expression *cur, *next;	struct binding *binding;	struct binding_value *bv;	unsigned long ileft, iright;	switch (expr -> op) {	      case expr_check:	      case expr_equal:	      case expr_not_equal:	      case expr_and:	      case expr_or:	      case expr_not:	      case expr_match:	      case expr_static:	      case expr_known:	      case expr_none:	      case expr_exists:	      case expr_variable_exists:		log_error ("Boolean opcode in evaluate_numeric_expression: %d",		      expr -> op);		return 0;	      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_filename:	      case expr_sname:	      case expr_pick_first_value:	      case expr_host_decl_name:	      case expr_config_option:	      case expr_leased_address:	      case expr_null:		log_error ("Data opcode in evaluate_numeric_expression: %d",		      expr -> op);		return 0;	      case expr_extract_int8:		memset (&data, 0, sizeof data);		status = evaluate_data_expression			(&data, packet, lease, client_state, in_options,			 cfg_options, scope, expr -> data.extract_int, MDL);		if (status)			*result = data.data [0];#if defined (DEBUG_EXPRESSIONS)		log_debug ("num: extract_int8 (%s) = %s",		      status ? print_hex_1 (data.len, data.data, 60) : "NULL",		      status ? print_dec_1 (*result) : "NULL" );#endif		if (status) data_string_forget (&data, MDL);		return status;	      case expr_extract_int16:		memset (&data, 0, sizeof data);		status = (evaluate_data_expression			  (&data, packet, lease, client_state, in_options,			   cfg_options, scope, expr -> data.extract_int, MDL));		if (status && data.len >= 2)			*result = getUShort (data.data);#if defined (DEBUG_EXPRESSIONS)		log_debug ("num: extract_int16 (%s) = %ld",		      ((status && data.len >= 2) ?		       print_hex_1 (data.len, data.data, 60) : "NULL"),		      *result);#endif		if (status) data_string_forget (&data, MDL);		return (status && data.len >= 2);	      case expr_extract_int32:		memset (&data, 0, sizeof data);		status = (evaluate_data_expression			  (&data, packet, lease, client_state, in_options,			   cfg_options, scope, expr -> data.extract_int, MDL));		if (status && data.len >= 4)			*result = getULong (data.data);#if defined (DEBUG_EXPRESSIONS)		log_debug ("num: extract_int32 (%s) = %ld",		      ((status && data.len >= 4) ?		       print_hex_1 (data.len, data.data, 60) : "NULL"),		      *result);#endif		if (status) data_string_forget (&data, MDL);		return (status && data.len >= 4);	      case expr_const_int:		*result = expr -> data.const_int;#if defined (DEBUG_EXPRESSIONS)		log_debug ("number: CONSTANT = %ld", *result);#endif		return 1;	      case expr_lease_time:		if (!lease) {			log_error ("data: leased_lease: not available");			return 0;		}		if (lease -> ends < cur_time) {			log_error ("%s %lu when it is now %lu",				   "data: lease_time: lease ends at",				   (long)(lease -> ends), (long)cur_time);			return 0;		}		*result = lease -> ends - cur_time;#if defined (DEBUG_EXPRESSIONS)		log_debug ("number: lease-time = (%lu - %lu) = %ld",			   lease -> ends,			   cur_time, *result);#endif		return 1; 	      case expr_dns_transaction:#if !defined (NSUPDATE)		return 0;#else		if (!resolver_inited) {			minires_ninit (&resolver_state);			resolver_inited = 1;			resolver_state.retrans = 1;			resolver_state.retry = 1;		}		ISC_LIST_INIT (uq);		cur = expr;		do {		    next = cur -> data.dns_transaction.cdr;		    nut = 0;		    status = (evaluate_dns_expression			      (&nut, packet,			       lease, client_state, in_options, cfg_options,			       scope, cur -> data.dns_transaction.car));		    if (!status)			    goto dns_bad;		    ISC_LIST_APPEND (uq, nut, r_link);		    cur = next;		} while (next);		/* Do the update and record the error code, if there was		   an error; otherwise set it to NOERROR. */		*result = minires_nupdate (&resolver_state,					   ISC_LIST_HEAD (uq));		status = 1;		print_dns_status ((int)*result, &uq);	      dns_bad:		while (!ISC_LIST_EMPTY (uq)) {			ns_updrec *tmp = ISC_LIST_HEAD (uq);			ISC_LIST_UNLINK (uq, tmp, r_link);			if (tmp -> r_data_ephem) {				dfree (tmp -> r_data_ephem, MDL);				tmp -> r_data = (unsigned char *)0;				tmp -> r_data_ephem = (unsigned char *)0;			}			minires_freeupdrec (tmp);		}		return status;#endif /* NSUPDATE */	      case expr_variable_reference:		if (scope && *scope) {		    binding = find_binding (*scope, expr -> data.variable);		    if (binding && binding -> value) {			if (binding -> value -> type == binding_numeric) {				*result = binding -> value -> value.intval;			    status = 1;			} else {				log_error ("binding type %d in %s.",					   binding -> value -> type,					   "evaluate_numeric_expression");				status = 0;			}		    } else			status = 0;		} else		    status = 0;#if defined (DEBUG_EXPRESSIONS)		if (status)			log_debug ("numeric: %s = %ld",				   expr -> data.variable, *result);		else			log_debug ("numeric: %s = NULL",				   expr -> data.variable);#endif		return status;	      case expr_funcall:		bv = (struct binding_value *)0;		status = evaluate_expression (&bv, packet, lease,					      client_state,					      in_options, cfg_options,					      scope, expr, MDL);		if (status) {			if (bv -> type != binding_numeric)				log_error ("%s() returned type %d in %s.",					   expr -> data.funcall.name,					   bv -> type,					   "evaluate_numeric_expression");			else				*result = bv -> value.intval;			binding_value_dereference (&bv, MDL);		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: %s = %ld", expr -> data.funcall.name,			   status ? *result : 0);#endif		break;	      case expr_add:		sleft = evaluate_numeric_expression (&ileft, packet, lease,						     client_state,						     in_options, cfg_options,						     scope,						     expr -> data.and [0]);		sright = evaluate_numeric_expression (&iright, packet, lease,						      client_state,						      in_options, cfg_options,						      scope,						      expr -> data.and [1]);#if defined (DEBUG_EXPRESSIONS)		if (sleft && sright)			log_debug ("num: %ld + %ld = %ld",				   ileft, iright, ileft + iright);		else if (sleft)			log_debug ("num: %ld + NULL = NULL", ileft);		else			log_debug ("num: NULL + %ld = NULL", iright);#endif		if (sleft && sright) {			*result = ileft + iright;			return 1;		}		return 0;	      case expr_subtract:		sleft = evaluate_numeric_expression (&ileft, packet, lease,						     client_state,						     in_options, cfg_options,						     scope,						     expr -> data.and [0]);		sright = evaluate_numeric_expression (&iright, packet, lease,						      client_state,						      in_options, cfg_options,						      scope,						      expr -> data.and [1]);#if defined (DEBUG_EXPRESSIONS)		if (sleft && sright)			log_debug ("num: %ld - %ld = %ld",				   ileft, iright, ileft - iright);		else if (sleft)			log_debug

⌨️ 快捷键说明

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