[CRIU] [PATCH 1/2] crit: Decode some numbers into strings

Andrei Vagin avagin at virtuozzo.com
Wed Apr 12 16:25:01 PDT 2017


Applied, thanks!

On Mon, Apr 10, 2017 at 02:02:00PM +0300, Pavel Emelyanov wrote:
> There are several places in image files, where we store
> integers, but these numbers actually mean some string.
> E.g. socket families, states and types and tasks states.
> 
> So here's the (criu).dict option for such fields that
> helps to convert the numbers into strings and back.
> 
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> 
> ---
>  images/core.proto        |  2 +-
>  images/opts.proto        |  1 +
>  images/sk-inet.proto     |  8 ++++----
>  images/sk-unix.proto     |  4 ++--
>  lib/py/images/pb2dict.py | 33 +++++++++++++++++++++++++++++++++
>  5 files changed, 41 insertions(+), 7 deletions(-)
> 
> diff --git a/images/core.proto b/images/core.proto
> index 14f13f8..9c2254d 100644
> --- a/images/core.proto
> +++ b/images/core.proto
> @@ -23,7 +23,7 @@ enum seccomp_mode {
>  };
>  
>  message task_core_entry {
> -	required uint32			task_state	= 1;
> +	required uint32			task_state	= 1 [(criu).dict = "gen"];
>  	required uint32			exit_code	= 2;
>  
>  	required uint32			personality	= 3;
> diff --git a/images/opts.proto b/images/opts.proto
> index 380d54a..a2cdd75 100644
> --- a/images/opts.proto
> +++ b/images/opts.proto
> @@ -8,6 +8,7 @@ message CRIU_Opts {
>  	optional string flags = 3;
>  	optional bool dev = 4; // Device major:minor packed
>  	optional bool odev = 5; // ... in old format
> +	optional string dict = 6;
>  }
>  
>  extend google.protobuf.FieldOptions {
> diff --git a/images/sk-inet.proto b/images/sk-inet.proto
> index b03d1fc..cb8245c 100644
> --- a/images/sk-inet.proto
> +++ b/images/sk-inet.proto
> @@ -22,10 +22,10 @@ message inet_sk_entry {
>  	 */
>  	required uint32			id		=  1;
>  	required uint32			ino		=  2;
> -	required uint32			family		=  3;
> -	required uint32			type		=  4;
> -	required uint32			proto		=  5;
> -	required uint32			state		=  6;
> +	required uint32			family		=  3 [(criu).dict = "sk"];
> +	required uint32			type		=  4 [(criu).dict = "sk"];
> +	required uint32			proto		=  5 [(criu).dict = "sk"];
> +	required uint32			state		=  6 [(criu).dict = "sk"];
>  	required uint32			src_port	=  7;
>  	required uint32			dst_port	=  8;
>  	required uint32			flags		=  9 [(criu).hex = true];
> diff --git a/images/sk-unix.proto b/images/sk-unix.proto
> index d695070..c9cdc10 100644
> --- a/images/sk-unix.proto
> +++ b/images/sk-unix.proto
> @@ -24,8 +24,8 @@ message unix_sk_entry {
>  	 */
>  	required uint32			id		=  1;
>  	required uint32			ino		=  2;
> -	required uint32			type		=  3;
> -	required uint32			state		=  4;
> +	required uint32			type		=  3 [(criu).dict = "sk"];
> +	required uint32			state		=  4 [(criu).dict = "sk"];
>  	required uint32			flags		=  5 [(criu).hex = true];
>  	required uint32			uflags		=  6 [(criu).hex = true];
>  	required uint32			backlog		=  7;
> diff --git a/lib/py/images/pb2dict.py b/lib/py/images/pb2dict.py
> index 769b63b..89aa423 100644
> --- a/lib/py/images/pb2dict.py
> +++ b/lib/py/images/pb2dict.py
> @@ -57,6 +57,9 @@ def _marked_as_dev(field):
>  def _marked_as_odev(field):
>  	return field.GetOptions().Extensions[opts_pb2.criu].odev
>  
> +def _marked_as_dict(field):
> +	return field.GetOptions().Extensions[opts_pb2.criu].dict
> +
>  mmap_prot_map = [
>  	('PROT_READ',	0x1),
>  	('PROT_WRITE',	0x2),
> @@ -113,6 +116,25 @@ flags_maps = {
>  	'pmap.flags' : pmap_flags_map,
>  }
>  
> +gen_maps = {
> +	'task_state' : { 1: 'Alive', 3: 'Zombie', 6: 'Stopped' },
> +}
> +
> +sk_maps = {
> +	'family'    : { 2: 'INET' },
> +	'type'      : { 1: 'STREAM', 2: 'DGRAM' },
> +	'state'     : { 1: 'ESTABLISHED', 7: 'CLOSE', 10: 'LISTEN' },
> +	'proto'     : { 6: 'TCP' },
> +}
> +
> +gen_rmaps = { k: {v2:k2 for k2,v2 in v.items()} for k,v in gen_maps.items() }
> +sk_rmaps = { k: {v2:k2 for k2,v2 in v.items()} for k,v in sk_maps.items() }
> +
> +dict_maps = {
> +	'gen' : ( gen_maps, gen_rmaps ),
> +	'sk'  : ( sk_maps, sk_rmaps ),
> +}
> +
>  def map_flags(value, flags_map):
>  	bs = map(lambda x: x[0], filter(lambda x: value & x[1], flags_map))
>  	value &= ~sum(map(lambda x: x[1], flags_map))
> @@ -175,6 +197,10 @@ def _pb2dict_cast(field, value, pretty = False, is_hex = False):
>  				else:
>  					return map_flags(value, flags_map)
>  
> +			dct = _marked_as_dict(field)
> +			if dct:
> +				return dict_maps[dct][0][field.name].get(value, cast(value))
> +
>  		return cast(value)
>  	else:
>  		raise Exception("Field(%s) has unsupported type %d" % (field.name, field.type))
> @@ -232,6 +258,13 @@ def _dict2pb_cast(field, value):
>  				else:
>  					return unmap_flags(value, flags_map)
>  
> +			dct = _marked_as_dict(field)
> +			if dct:
> +				ret = dict_maps[dct][1][field.name].get(value, None)
> +				if ret == None:
> +					ret = cast(value, 0)
> +				return ret
> +
>  			# Some int or long fields might be stored as hex
>  			# strings. See _pb2dict_cast.
>  			return cast(value, 0)
> -- 
> 2.5.5
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list