On Fri, Jun 17, 2016 at 04:29:57PM +0000, Fabien Siron wrote: > Since our target is not in the same process, the netlink macros NLMSG_* > must be rewritten for strace. > > * netlink.c (nlmsg_fetch, nlmsg_next): New functions. > --- > netlink.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/netlink.c b/netlink.c > index c43f6e7..1211d57 100644 > --- a/netlink.c > +++ b/netlink.c > @@ -31,6 +31,32 @@ > #include "xlat/netlink_flags.h" > #include "xlat/netlink_types.h" > > +/* since our target is not in the same process, here are some utils for > nlmsg */ > +static int > +nlmsg_ok(struct tcb *tcp, unsigned long nlh, unsigned long len) { > + struct nlmsghdr nlmsghdr; > + > + if (umoven(tcp, nlh, sizeof(struct nlmsghdr), &nlmsghdr) == -1) > + return 0; > + > + return (len >= (int)sizeof(struct nlmsghdr)) && > + nlmsghdr.nlmsg_len >= sizeof(struct nlmsghdr) && > + nlmsghdr.nlmsg_len <= len; > +} > + > +static unsigned long > +nlmsg_next(struct tcb *tcp, unsigned long nlh, unsigned long *len) { > + struct nlmsghdr nlmsghdr; > + > + if (umoven(tcp, nlh, sizeof(struct nlmsghdr), &nlmsghdr) == -1) > + return 0; > + > + *len -= NLMSG_ALIGN(nlmsghdr.nlmsg_len); > + > + return (unsigned long) > + ((char *)(nlh) + NLMSG_ALIGN(nlmsghdr.nlmsg_len)); > +} > + > void > decode_netlink(struct tcb *tcp, unsigned long addr, unsigned long size) > { On Fri, Jun 17, 2016 at 04:29:58PM +0000, Fabien Siron wrote: > * netlink.c (decode_netlink_or_printaddr_msg): From > decode_netlink_or_printaddr(). > (decode_netlink_or_printaddr): Call decode_netlink_or_printaddr_msg(). > --- > netlink.c | 42 ++++++++++++++++++++++++++---------------- > 1 file changed, 26 insertions(+), 16 deletions(-) > > diff --git a/netlink.c b/netlink.c > index 1211d57..a2beec6 100644 > --- a/netlink.c > +++ b/netlink.c > @@ -33,32 +33,33 @@ > > /* since our target is not in the same process, here are some utils for > nlmsg */ > static int > -nlmsg_ok(struct tcb *tcp, unsigned long nlh, unsigned long len) { > - struct nlmsghdr nlmsghdr; > +nlmsg_fetch(struct tcb *tcp, struct nlmsghdr *nlmsghdr, unsigned long addr, > + unsigned long len) { > + > + if (len < (int)sizeof(struct nlmsghdr)) { > + if (len != 0) > + printstr(tcp, (unsigned long)addr, len); > + return 0; > + } > > - if (umoven(tcp, nlh, sizeof(struct nlmsghdr), &nlmsghdr) == -1) > + if (umove_or_printaddr(tcp, addr, nlmsghdr) == -1) > return 0; > > - return (len >= (int)sizeof(struct nlmsghdr)) && > - nlmsghdr.nlmsg_len >= sizeof(struct nlmsghdr) && > - nlmsghdr.nlmsg_len <= len; > + return nlmsghdr->nlmsg_len >= sizeof(struct nlmsghdr) && > + nlmsghdr->nlmsg_len <= len; > } > > static unsigned long > -nlmsg_next(struct tcb *tcp, unsigned long nlh, unsigned long *len) { > - struct nlmsghdr nlmsghdr; > - > - if (umoven(tcp, nlh, sizeof(struct nlmsghdr), &nlmsghdr) == -1) > - return 0; > - > - *len -= NLMSG_ALIGN(nlmsghdr.nlmsg_len); > +nlmsg_next(struct nlmsghdr *nlmsghdr, unsigned long addr, unsigned long > *len) { > + *len -= NLMSG_ALIGN(nlmsghdr->nlmsg_len); > > return (unsigned long) > - ((char *)(nlh) + NLMSG_ALIGN(nlmsghdr.nlmsg_len)); > + ((char *)(addr) + NLMSG_ALIGN(nlmsghdr->nlmsg_len)); > }
Please squash these two commits into one. > -void > -decode_netlink(struct tcb *tcp, unsigned long addr, unsigned long size) > +static void > +decode_netlink_msg(struct tcb *tcp, unsigned long addr, > + unsigned long size) > { > struct nlmsghdr nlmsghdr; > > @@ -88,3 +89,12 @@ decode_netlink(struct tcb *tcp, unsigned long addr, > unsigned long size) > > tprints("}"); > } > + > +void > +decode_netlink(struct tcb *tcp, unsigned long addr, unsigned long size) { > + struct nlmsghdr nlmsghdr; > + > + for (; nlmsg_fetch(tcp, &nlmsghdr, addr, size); > + addr = nlmsg_next(&nlmsghdr, addr, &size)) > + decode_netlink_msg(tcp, addr, size); > +} Shouldn't output from subsequent decode_netlink_msg calls be delimited? -- ldv
pgpDKJiSfGJtL.pgp
Description: PGP signature
------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. http://sdm.link/zohomanageengine
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel