On Sun, Aug 24, 2014 at 04:44:23PM +0200, Zubin Mithra wrote:
> On 21-Aug-2014, at 4:27, Dmitry V. Levin <l...@altlinux.org> wrote:
> > On Thu, Aug 21, 2014 at 02:53:46AM +0400, Dmitry V. Levin wrote:
> >> On Mon, Aug 11, 2014 at 02:21:01PM +0530, zubin.mit...@gmail.com wrote:
> > [...]
> >>    if (!inet_ntop(diag_msg->idiag_family, diag_msg->id.idiag_dst,
> >>                   remote_addr_buf, size) || !remote_addr_buf[0])
> >>            return -1;
> > 
> > Also note for unconnected sockets idiag_dst/idiag_dport are zero, and
> > idiag_src/idiag_sport have to be used instead.
> 
> Currently for unconnected sockets, it would print out the socket inode 
> number(indicating that the socket is unconnected). Would printing idiag_sport 
> instead be confusing?

There are sockets with zero dst address:port and non-zero
src address:port.  For example, in your snapshot
(https://gist.github.com/eQu1NoX/5fe4d144a6d818382399):
accept(3<0.0.0.0:0>, {sa_family=AF_INET, sin_port=htons(48435), 
sin_addr=inet_addr("127.0.0.1")}, [16]) = 4

I think it would be less confusing to print both src and dst address:port
when dst address:port is non-zero, for example:
accept(3<0.0.0.0:7171>, {sa_family=AF_INET, sin_port=htons(48435), 
sin_addr=inet_addr("127.0.0.1")}, [16]) = 4<127.0.0.1:7171->127.0.0.1:48435>

static bool
parse_response(const struct inet_diag_msg *diag_msg, const unsigned long inode)
{
        static const char zero_addr[sizeof(struct in6_addr)];
        size_t addr_size;
        socklen_t text_size;

        if (diag_msg->idiag_inode != inode)
                return false;

        switch(diag_msg->idiag_family) {
                case AF_INET:
                        addr_size = sizeof(struct in_addr);
                        text_size = INET_ADDRSTRLEN;
                        break;
                case AF_INET6:
                        addr_size = sizeof(struct in6_addr);
                        text_size = INET6_ADDRSTRLEN;
                        break;
                default:
                        return false;
        }

        char src_buf[text_size];

        if (!inet_ntop(diag_msg->idiag_family, diag_msg->id.idiag_src,
                       src_buf, text_size))
                return false;

        if (diag_msg->id.idiag_dport ||
            memcmp(zero_addr, diag_msg->id.idiag_dst, addr_size)) {
                char dst_buf[text_size];

                if (!inet_ntop(diag_msg->idiag_family, diag_msg->id.idiag_dst,
                               dst_buf, text_size))
                        return false;

                tprintf("%s:%u->%s:%u",
                        src_buf, ntohs(diag_msg->id.idiag_sport),
                        dst_buf, ntohs(diag_msg->id.idiag_dport));
        } else {
                tprintf("%s:%u", src_buf, ntohs(diag_msg->id.idiag_sport));
        }

        return true;
}


-- 
ldv

Attachment: pgp7rmsDKFVQ9.pgp
Description: PGP signature

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to