[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