* 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)); } -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); +} -- 2.8.3 ------------------------------------------------------------------------------ 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