summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2018-05-18 17:36:00 +0200
committerDmitry V. Levin <ldv@altlinux.org>2018-06-06 15:10:37 +0000
commit79a02d029ccd6d998479d1cf58c812a7ea05ab73 (patch)
treedbbc1e7b0b50c2eec07e0fb417b5407620082cf6
parentbdc6ca9e5665bf8543b45a11afcb2fa48fa5d07b (diff)
downloadstrace-79a02d029ccd6d998479d1cf58c812a7ea05ab73.tar.gz
nlattr: add value processing support for xlat/flags nlattr decoders
Needed for upcoming decoder of ethernet proto which is stored in the host order and has to be converted to the network order before printing as an xval constant. This change also adds ability to provide prefix/suffix in order to enclose the printed value in something that describes the performed conversion. * nlattr.h (struct decode_nla_xlat_opts): Add prefix, suffix, and process_fn fields. * nlattr.c (decode_nla_xval, decode_nla_flags): Handle process_fn, prefix, snd uffix parameters.
-rw-r--r--nlattr.c16
-rw-r--r--nlattr.h3
2 files changed, 19 insertions, 0 deletions
diff --git a/nlattr.c b/nlattr.c
index 835cf25e5..b11f68210 100644
--- a/nlattr.c
+++ b/nlattr.c
@@ -273,8 +273,16 @@ decode_nla_xval(struct tcb *const tcp,
if (len > sizeof(data))
return false;
else if (!umoven_or_printaddr(tcp, addr, len, data.bytes + bytes_offs))
+ {
+ if (opts->process_fn)
+ data.val = opts->process_fn(data.val);
+ if (opts->prefix)
+ tprints(opts->prefix);
printxval_dispatch_ex(opts->xlat, opts->xlat_size, data.val,
opts->dflt, opts->xt, opts->style);
+ if (opts->suffix)
+ tprints(opts->suffix);
+ }
return true;
}
@@ -315,8 +323,16 @@ decode_nla_flags(struct tcb *const tcp,
if (len > sizeof(data))
return false;
else if (!umoven_or_printaddr(tcp, addr, len, data.bytes + bytes_offs))
+ {
+ if (opts->process_fn)
+ data.flags = opts->process_fn(data.flags);
+ if (opts->prefix)
+ tprints(opts->prefix);
printflags_ex(data.flags, opts->dflt, opts->style, opts->xlat,
NULL);
+ if (opts->suffix)
+ tprints(opts->suffix);
+ }
return true;
}
diff --git a/nlattr.h b/nlattr.h
index fc7a67d92..478b8f118 100644
--- a/nlattr.h
+++ b/nlattr.h
@@ -38,6 +38,9 @@ struct decode_nla_xlat_opts {
const char *dflt;
enum xlat_type xt;
enum xlat_style style;
+ const char *prefix;
+ const char *suffix;
+ uint64_t (*process_fn)(uint64_t val);
};
typedef bool (*nla_decoder_t)(struct tcb *, kernel_ulong_t addr,