]> granicus.if.org Git - strace/blobdiff - net.c
Add a enum for decoding to tprint_iov() and tprint_iov_upto()
[strace] / net.c
diff --git a/net.c b/net.c
index 8b2c3899efa5c0c4f59597854b94e4376f66cd78..a55fb640d4c79050dab27b8ce38d692feb666937 100644 (file)
--- a/net.c
+++ b/net.c
@@ -123,9 +123,7 @@ typedef union {
        struct sockaddr sa;
        struct sockaddr_in sin;
        struct sockaddr_un sau;
-#ifdef HAVE_INET_NTOP
        struct sockaddr_in6 sa6;
-#endif
        struct sockaddr_ipx sipx;
        struct sockaddr_ll ll;
        struct sockaddr_nl nl;
@@ -137,9 +135,11 @@ typedef union {
 #endif
 } sockaddr_buf_t;
 
-static void
-print_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
+void
+print_sockaddr(struct tcb *tcp, const void *const buf, const int addrlen)
 {
+       const sockaddr_buf_t *const addr = buf;
+
        tprints("{sa_family=");
        printxval(addrfams, addr->sa.sa_family, "AF_???");
        tprints(", ");
@@ -164,7 +164,7 @@ print_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
                tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
                        ntohs(addr->sin.sin_port), inet_ntoa(addr->sin.sin_addr));
                break;
-#ifdef HAVE_INET_NTOP
+
        case AF_INET6:
                {
                        char string_addr[100];
@@ -174,19 +174,18 @@ print_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
                                ", \"%s\", &sin6_addr), sin6_flowinfo=%u",
                                ntohs(addr->sa6.sin6_port), string_addr,
                                addr->sa6.sin6_flowinfo);
-# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
                        tprints(", sin6_scope_id=");
-#  if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
+# if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
                        if (IN6_IS_ADDR_LINKLOCAL(&addr->sa6.sin6_addr)
                            || IN6_IS_ADDR_MC_LINKLOCAL(&addr->sa6.sin6_addr))
                                print_ifindex(addr->sa6.sin6_scope_id);
                        else
-#  endif
+# endif
                                tprintf("%u", addr->sa6.sin6_scope_id);
-# endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */
+#endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */
                }
                break;
-#endif
 
        case AF_IPX:
                {
@@ -256,25 +255,31 @@ print_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
        tprints("}");
 }
 
-void
+int
 printsock(struct tcb *tcp, long addr, int addrlen)
 {
-       sockaddr_buf_t addrbuf;
-
        if (addrlen < 2) {
                printaddr(addr);
-               return;
+               return -1;
        }
 
-       if (addrlen > (int) sizeof(addrbuf))
-               addrlen = sizeof(addrbuf);
+       union {
+               struct sockaddr sa;
+               struct sockaddr_storage storage;
+               char pad[sizeof(struct sockaddr_storage) + 1];
+       } addrbuf;
+
+       if ((unsigned) addrlen > sizeof(addrbuf.storage))
+               addrlen = sizeof(addrbuf.storage);
 
-       memset(&addrbuf, 0, sizeof(addrbuf));
        if (umoven_or_printaddr(tcp, addr, addrlen, addrbuf.pad))
-               return;
-       addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
+               return -1;
+
+       memset(&addrbuf.pad[addrlen], 0, sizeof(addrbuf.pad) - addrlen);
 
        print_sockaddr(tcp, &addrbuf, addrlen);
+
+       return addrbuf.sa.sa_family;
 }
 
 #include "xlat/scmvals.h"
@@ -431,8 +436,7 @@ print_cmsg_ip_recverr(struct tcb *tcp, const void *cmsg_data,
                ", ee_info=%u, ee_data=%u, offender=",
                err->ee_errno, err->ee_origin, err->ee_type,
                err->ee_code, err->ee_info, err->ee_data);
-       print_sockaddr(tcp, (const void *) &err->offender,
-               sizeof(err->offender));
+       print_sockaddr(tcp, &err->offender, sizeof(err->offender));
        tprints("}");
 }
 
@@ -578,8 +582,9 @@ do_msghdr(struct tcb *tcp, struct msghdr *msg, unsigned long data_size)
        printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
 
        tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
+
        tprint_iov_upto(tcp, (unsigned long)msg->msg_iovlen,
-                  (unsigned long)msg->msg_iov, 1, data_size);
+                       (unsigned long)msg->msg_iov, IOV_DECODE_STR, data_size);
 
 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
        tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
@@ -1345,7 +1350,6 @@ print_mreq6(struct tcb *tcp, long addr, unsigned int len)
        if (umove_or_printaddr(tcp, addr, &mreq))
                return;
 
-#ifdef HAVE_INET_NTOP
        const struct in6_addr *in6 = &mreq.ipv6mr_multiaddr;
        char address[INET6_ADDRSTRLEN];
 
@@ -1358,7 +1362,6 @@ print_mreq6(struct tcb *tcp, long addr, unsigned int len)
        print_ifindex(mreq.ipv6mr_interface);
        tprints("}");
        return;
-#endif /* HAVE_INET_NTOP */
 
 fail:
        printstr(tcp, addr, len);
@@ -1378,8 +1381,7 @@ print_group_req(struct tcb *tcp, long addr, int len)
        }
 
        tprintf("{gr_interface=%u, gr_group=", greq.gr_interface);
-       print_sockaddr(tcp, (const void *) &greq.gr_group,
-                      sizeof(greq.gr_group));
+       print_sockaddr(tcp, &greq.gr_group, sizeof(greq.gr_group));
        tprintf("}");
 
 }