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

📄 tree.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (buffer_allocate (&result -> buffer, result -> len,				     file, line)) {			result -> data = &result -> buffer -> data [0];			result -> buffer -> data [0] = packet -> raw -> htype;			memcpy (&result -> buffer -> data [1],				packet -> raw -> chaddr,				packet -> raw -> hlen);			result -> terminated = 0;		} else {			log_error ("data: hardware: no memory for buffer.");			return 0;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: hardware = %s",		      print_hex_1 (result -> len, result -> data, 60));#endif		return 1;		/* Extract part of the raw packet. */	      case expr_packet:		if (!packet || !packet -> raw) {			log_error ("data: packet: raw packet not available");			return 0;		}		s0 = evaluate_numeric_expression (&offset, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.packet.offset);		s1 = evaluate_numeric_expression (&len,						  packet, lease, client_state,						  in_options, cfg_options,						  scope,						  expr -> data.packet.len);		if (s0 && s1 && offset < packet -> packet_length) {			if (offset + len > packet -> packet_length)				result -> len =					packet -> packet_length - offset;			else				result -> len = len;			if (buffer_allocate (&result -> buffer,					     result -> len, file, line)) {				result -> data = &result -> buffer -> data [0];				memcpy (result -> buffer -> data,					(((unsigned char *)(packet -> raw))					 + offset), result -> len);				result -> terminated = 0;			} else {				log_error ("data: packet: no buffer memory.");				return 0;			}			s2 = 1;		} else			s2 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: packet (%ld, %ld) = %s",		      offset, len,		      s2 ? print_hex_1 (result -> len,					result -> data, 60) : NULL);#endif		return s2;		/* The encapsulation of all defined options in an		   option space... */	      case expr_encapsulate:		if (cfg_options)			s0 = option_space_encapsulate				(result, packet, lease, client_state,				 in_options, cfg_options, scope,				 &expr -> data.encapsulate);		else			s0 = 0;#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: encapsulate (%s) = %s",			  expr -> data.encapsulate.data,			  s0 ? print_hex_1 (result -> len,					    result -> data, 60) : "NULL");#endif		return s0;		/* Some constant data... */	      case expr_const_data:#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: const = %s",		      print_hex_1 (expr -> data.const_data.len,				   expr -> data.const_data.data, 60));#endif		data_string_copy (result,				  &expr -> data.const_data, file, line);		return 1;		/* Hostname lookup... */	      case expr_host_lookup:		s0 = do_host_lookup (result, expr -> data.host_lookup);#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: DNS lookup (%s) = %s",		      expr -> data.host_lookup -> hostname,		      (s0		       ? print_dotted_quads (result -> len, result -> data)		       : "NULL"));#endif		return s0;		/* Concatenation... */	      case expr_concat:		memset (&data, 0, sizeof data);		s0 = evaluate_data_expression (&data, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.concat [0], MDL);		memset (&other, 0, sizeof other);		s1 = evaluate_data_expression (&other, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.concat [1], MDL);		if (s0 && s1) {		    result -> len = data.len + other.len;		    if (!buffer_allocate (&result -> buffer,					  (result -> len + other.terminated),					  file, line)) {				log_error ("data: concat: no memory");				result -> len = 0;				data_string_forget (&data, MDL);				data_string_forget (&other, MDL);				return 0;			}			result -> data = &result -> buffer -> data [0];			memcpy (result -> buffer -> data, data.data, data.len);			memcpy (&result -> buffer -> data [data.len],				other.data, other.len + other.terminated);		}		if (s0)			data_string_forget (&data, MDL);		if (s1)			data_string_forget (&other, MDL);#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: concat (%s, %s) = %s",		      s0 ? print_hex_1 (data.len, data.data, 20) : "NULL",		      s1 ? print_hex_2 (other.len, other.data, 20) : "NULL",		      ((s0 && s1)		       ? print_hex_3 (result -> len, result -> data, 30)		       : "NULL"));#endif		return s0 && s1;	      case expr_encode_int8:		s0 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.encode_int);		if (s0) {			result -> len = 1;			if (!buffer_allocate (&result -> buffer,					      1, file, line)) {				log_error ("data: encode_int8: no memory");				result -> len = 0;				s0 = 0;			} else {				result -> data = &result -> buffer -> data [0];				result -> buffer -> data [0] = len;			}		} else			result -> len = 0;#if defined (DEBUG_EXPRESSIONS)		if (!s0)			log_debug ("data: encode_int8 (NULL) = NULL");		else			log_debug ("data: encode_int8 (%ld) = %s", len,				  print_hex_2 (result -> len,					       result -> data, 20));#endif		return s0;						      case expr_encode_int16:		s0 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.encode_int);		if (s0) {			result -> len = 2;			if (!buffer_allocate (&result -> buffer, 2,					      file, line)) {				log_error ("data: encode_int16: no memory");				result -> len = 0;				s0 = 0;			} else {				result -> data = &result -> buffer -> data [0];				putUShort (result -> buffer -> data, len);			}		} else			result -> len = 0;#if defined (DEBUG_EXPRESSIONS)		if (!s0)			log_debug ("data: encode_int16 (NULL) = NULL");		else			log_debug ("data: encode_int16 (%ld) = %s", len,				  print_hex_2 (result -> len,					       result -> data, 20));#endif		return s0;	      case expr_encode_int32:		s0 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.encode_int);		if (s0) {			result -> len = 4;			if (!buffer_allocate (&result -> buffer, 4,					      file, line)) {				log_error ("data: encode_int32: no memory");				result -> len = 0;				s0 = 0;			} else {				result -> data = &result -> buffer -> data [0];				putULong (result -> buffer -> data, len);			}		} else			result -> len = 0;#if defined (DEBUG_EXPRESSIONS)		if (!s0)			log_debug ("data: encode_int32 (NULL) = NULL");		else			log_debug ("data: encode_int32 (%ld) = %s", len,				  print_hex_2 (result -> len,					       result -> data, 20));#endif		return s0;	      case expr_binary_to_ascii:		/* Evaluate the base (offset) and width (len): */		s0 = evaluate_numeric_expression			(&offset, packet, lease, client_state, in_options,			 cfg_options, scope, expr -> data.b2a.base);		s1 = evaluate_numeric_expression (&len, packet, lease,						  client_state,						  in_options, cfg_options,						  scope,						  expr -> data.b2a.width);		/* Evaluate the seperator string. */		memset (&data, 0, sizeof data);		s2 = evaluate_data_expression (&data, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.b2a.seperator,					       MDL);		/* Evaluate the data to be converted. */		memset (&other, 0, sizeof other);		s3 = evaluate_data_expression (&other, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.b2a.buffer, MDL);		if (s0 && s1 && s2 && s3) {			unsigned buflen, i;			if (len != 8 && len != 16 && len != 32) {				log_info ("binary_to_ascii: %s %ld!",					  "invalid width", len);				goto b2a_out;			}			len /= 8;			/* The buffer must be a multiple of the number's			   width. */			if (other.len % len) {				log_info ("binary-to-ascii: %s %d %s %ld!",					  "length of buffer", other.len,					  "not a multiple of width", len);				status = 0;				goto b2a_out;			}			/* Count the width of the output. */			buflen = 0;			for (i = 0; i < other.len; i += len) {				if (len == 1) {					if (offset == 8) {						if (other.data [i] < 8)							buflen++;						else if (other.data [i] < 64)							buflen += 2;						else							buflen += 3;					} else if (offset == 10) {						if (other.data [i] < 10)							buflen++;						else if (other.data [i] < 100)							buflen += 2;						else							buflen += 3;					} else if (offset == 16) {						if (other.data [i] < 16)							buflen++;						else							buflen += 2;					} else						buflen += (converted_length							   (&other.data [i],							    offset, 1));				} else					buflen += (converted_length						   (&other.data [i],						    offset, len));				if (i + len != other.len)					buflen += data.len;			}			if (!buffer_allocate (&result -> buffer,					      buflen + 1, file, line)) {				log_error ("data: binary-to-ascii: no memory");				status = 0;				goto b2a_out;			}			result -> data = &result -> buffer -> data [0];			result -> len = buflen;			result -> terminated = 1;			buflen = 0;			for (i = 0; i < other.len; i += len) {				buflen += (binary_to_ascii					   (&result -> buffer -> data [buflen],					    &other.data [i], offset, len));				if (i + len != other.len) {					memcpy (&result ->						buffer -> data [buflen],						data.data, data.len);					buflen += data.len;				}			}			/* NUL terminate. */			result -> buffer -> data [buflen] = 0;			status = 1;		} else			status = 0;	      b2a_out:#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: binary-to-ascii (%s, %s, %s, %s) = %s",		      s0 ? print_dec_1 (offset) : "NULL",		      s1 ? print_dec_2 (len) : "NULL",		      s2 ? print_hex_1 (data.len, data.data, 30) : "NULL",		      s3 ? print_hex_2 (other.len, other.data, 30) : "NULL",		      (status ? print_hex_3 (result -> len, result -> data, 30)		          : "NULL"));#endif		if (s2)			data_string_forget (&data, MDL);		if (s3)			data_string_forget (&other, MDL);		if (status)			return 1;		return 0;	      case expr_reverse:		/* Evaluate the width (len): */		s0 = evaluate_numeric_expression			(&len, packet, lease, client_state, in_options,			 cfg_options, scope, expr -> data.reverse.width);		/* Evaluate the data. */		memset (&data, 0, sizeof data);		s1 = evaluate_data_expression (&data, packet, lease,					       client_state,					       in_options, cfg_options, scope,					       expr -> data.reverse.buffer,					       MDL);		if (s0 && s1) {			char *upper;			int i;			/* The buffer must be a multiple of the number's			   width. */			if (data.len % len) {				log_info ("reverse: %s %d %s %ld!",					  "length of buffer", data.len,					  "not a multiple of width", len);				status = 0;				goto reverse_out;			}			/* XXX reverse in place?   I don't think we can. */			if (!buffer_allocate (&result -> buffer,					      data.len, file, line)) {				log_error ("data: reverse: no memory");				status = 0;				goto reverse_out;			}			result -> data = &result -> buffer -> data [0];			result -> len = data.len;			result -> terminated = 0;			for (i = 0; i < data.len; i += len) {				memcpy (&result -> buffer -> data [i],					&data.data [data.len - i - len], len);			}			status = 1;		} else			status = 0;	      reverse_out:#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: reverse (%s, %s) = %s",		      s0 ? print_dec_1 (len) : "NULL",		      s1 ? print_hex_1 (data.len, data.data, 30) : "NULL",		      (status ? print_hex_3 (result -> len, result -> data, 30)		          : "NULL"));#endif		if (s0)			data_string_forget (&data, MDL);		if (status)			return 1;		return 0;	      case expr_leased_address:		if (!lease) {			log_error ("data: leased_address: not available");			return 0;		}		result -> len = lease -> ip_addr.len;		if (buffer_allocate (&result -> buffer, result -> len,				     file, line)) {			result -> data = &result -> buffer -> data [0];			memcpy (&result -> buffer -> data [0],				lease -> ip_addr.iabuf, lease -> ip_addr.len);			result -> terminated = 0;		} else {			log_error ("data: leased-address: no memory.");			return 0;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: leased-address = %s",		      print_hex_1 (result -> len, result -> data, 60));#endif		return 1;	      case expr_pick_first_value:		memset (&data, 0, sizeof data);		if ((evaluate_data_expression		     (result, packet,		      lease, client_state, in_options, cfg_options,		      scope, expr -> data.pick_first_value.car, MDL))) {#if defined (DEBUG_EXPRESSIONS)			log_debug ("data: pick_first_value (%s, xxx)",				   print_hex_1 (result -> len,						result -> data, 40));#endif			return 1;		}		if (expr -> data.pick_first_value.cdr &&		    (evaluate_data_expression		     (result, packet,		      lease, client_state, in_options, cfg_options,		      scope, expr -> data.pick_first_value.cdr, MDL))) {#if defined (DEBUG_EXPRESSIONS)			log_debug ("data: pick_first_value (NULL, %s)",				   print_hex_1 (result -> len,						result -> data, 40));#endif			return 1;		}#if defined (DEBUG_EXPRESSIONS)		log_debug ("data: pick_first_value (NULL, NULL) = NULL");#endif		return 0;

⌨️ 快捷键说明

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