On Sat, Feb 7, 2015 at 12:55 AM, Dmitry V. Levin <l...@altlinux.org> wrote: > On Thu, Feb 05, 2015 at 07:28:45PM +0100, Ben Noordhuis wrote: >> +#ifdef IP_ADD_MEMBERSHIP >> +static void >> +print_mreq(struct tcb *tcp, long addr, int len) >> +{ >> + struct ip_mreq mreq; >> + if (len == sizeof(mreq) && umove(tcp, addr, &mreq) == 0) { >> + tprints("{imr_multiaddr=inet_addr("); >> + print_quoted_string(inet_ntoa(mreq.imr_multiaddr), >> + 16, QUOTE_0_TERMINATED); >> + tprints("), imr_interface=inet_addr("); >> + print_quoted_string(inet_ntoa(mreq.imr_interface), >> + 16, QUOTE_0_TERMINATED); >> + tprints(")}"); >> + } >> + else { >> + printstr(tcp, addr, len); >> + } >> +} > > Is there any use to print the address with printstr if length is not > sizeof(ip_mreq) or umove has failed? Other sockopt parsers in such > situations just print the address in hex.
Printing the raw data helps troubleshooting more than printing a memory address does, IMO. printstr() is also what print_getsockopt() and print_setsockopt() seem to fall back to. Let me know what you think is preferable. I agree that there is no point calling printstr() when umove() fails, I'll update that. ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel