Manage netlink "error" messages and "done" messages mainly to avoid later garbage printing.
* netlink.c (nlmsg_data, decode_netlink_nlmsghdr, decode_netlink_error): New functions. (decode_netlink_msg): Change return type to int and call decode_netlink_nlmsghdr() and decode_netlink_error(). (decode_netlink): Break loop if decode_netlink_msg() returns 0. --- netlink.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/netlink.c b/netlink.c index 77fb1d9..1174a3a 100644 --- a/netlink.c +++ b/netlink.c @@ -26,6 +26,7 @@ */ #include "defs.h" +#include <string.h> #include <sys/socket.h> #include <linux/netlink.h> #include "xlat/netlink_flags.h" @@ -67,34 +68,79 @@ next_nlmsg(struct nlmsghdr *nlmsghdr, unsigned long addr, unsigned long *len) { } } +static unsigned long +nlmsg_data(unsigned long nlh) { + return nlh + NLMSG_LENGTH(0); +} + static void -decode_netlink_msg(struct tcb *tcp, struct nlmsghdr *nlmsghdr, - unsigned long addr, unsigned long size) +decode_netlink_nlmsghdr(struct tcb *tcp, struct nlmsghdr *nlmsghdr) { - if (size < sizeof(struct nlmsghdr)) { - printstr(tcp, addr, size); - return; - } - - tprintf("{{len=%u, type=", nlmsghdr->nlmsg_len); + tprintf("{len=%u, type=", nlmsghdr->nlmsg_len); printxval(netlink_types, nlmsghdr->nlmsg_type, "NLMSG_???"); tprints(", flags="); printflags(netlink_flags, nlmsghdr->nlmsg_flags, "NLM_F_???"); - /* manage get/new requests */ tprintf(", seq=%u, pid=%u}", nlmsghdr->nlmsg_seq, nlmsghdr->nlmsg_pid); +} + +static void +decode_netlink_error(struct tcb *tcp, unsigned long addr, unsigned long size) +{ + struct nlmsgerr err; + + if (umove_or_printaddr(tcp, addr, &err) < 0) + return; + + tprintf(", {error=\"%s\", msg=", strerror(-err.error)); + + decode_netlink_nlmsghdr(tcp, &err.msg); + + tprints("}"); +} + +static int +decode_netlink_msg(struct tcb *tcp, struct nlmsghdr *nlmsghdr, + unsigned long addr, unsigned long size) +{ + if (size < sizeof(struct nlmsghdr)) { + printstr(tcp, addr, size); + return 0; + } + + tprints("{"); + + decode_netlink_nlmsghdr(tcp, nlmsghdr); if (nlmsghdr->nlmsg_len - sizeof(struct nlmsghdr) > 0) { - tprints(", "); + unsigned long data; + data = nlmsg_data(addr); + + if (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE) + { + switch (nlmsghdr->nlmsg_type) + { + case NLMSG_ERROR: + decode_netlink_error(tcp, data, + nlmsghdr->nlmsg_len - + sizeof(struct nlmsghdr)); + case NLMSG_DONE: + tprints("}"); + return 0; + } + } + tprints(", "); printstr(tcp, addr + sizeof(struct nlmsghdr), nlmsghdr->nlmsg_len - sizeof(struct nlmsghdr)); } tprints("}"); + + return 1; } void @@ -117,7 +163,8 @@ decode_netlink(struct tcb *tcp, unsigned long addr, unsigned long total_size) { print_array = 1; tprints("["); } - decode_netlink_msg(tcp, &nlmsghdr, addr, size); + if (!decode_netlink_msg(tcp, &nlmsghdr, addr, size)) + break; } if (print_array) { tprints("]"); -- 2.9.0 ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel