]> granicus.if.org Git - strace/commitdiff
Introduce print_inet_addr
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 15 Jun 2017 21:02:14 +0000 (21:02 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 15 Jun 2017 23:52:47 +0000 (23:52 +0000)
* defs.h (print_inet_addr): New prototype.
* sockaddr.c (print_inet_addr): New function.
(print_sockaddr_data_in6): Use it.
* net.c (print_mreq6): Likewise.
* tests/ip_mreq.c (main): Update expected output.

defs.h
net.c
sockaddr.c
tests/ip_mreq.c

diff --git a/defs.h b/defs.h
index f7d25f0ce98c88bcc856e58e604483cb0db9f8db..9dbb643691b3fe18ee312001d8e22c480b3c1a20 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -603,7 +603,9 @@ printpath(struct tcb *, kernel_ulong_t addr);
 #define TIMESPEC_TEXT_BUFSIZE \
                (sizeof(long long) * 3 * 2 + sizeof("{tv_sec=-, tv_nsec=}"))
 extern void printfd(struct tcb *, int);
-extern void print_sockaddr(struct tcb *tcp, const void *, int);
+extern void print_sockaddr(struct tcb *tcp, const void *sa, int len);
+extern bool
+print_inet_addr(int af, const void *addr, unsigned int len, const char *var_name);
 extern const char *get_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
 extern bool print_sockaddr_by_inode(struct tcb *, int fd, unsigned long inode);
 extern void print_dirfd(struct tcb *, int);
diff --git a/net.c b/net.c
index dba8a220e32ada13076f22b78607263dc86ab906..c254deb991f7c1536a54708cd639014386fc89a1 100644 (file)
--- a/net.c
+++ b/net.c
@@ -665,27 +665,20 @@ print_mreq6(struct tcb *const tcp, const kernel_ulong_t addr,
 {
        struct ipv6_mreq mreq;
 
-       if (len < sizeof(mreq))
-               goto fail;
-
+       if (len < sizeof(mreq)) {
+               printstrn(tcp, addr, len);
+               return;
+       }
        if (umove_or_printaddr(tcp, addr, &mreq))
                return;
 
-       const struct in6_addr *in6 = &mreq.ipv6mr_multiaddr;
-       char address[INET6_ADDRSTRLEN];
-
-       if (!inet_ntop(AF_INET6, in6, address, sizeof(address)))
-               goto fail;
+       tprints("{");
+       print_inet_addr(AF_INET6, &mreq.ipv6mr_multiaddr,
+                       sizeof(mreq.ipv6mr_multiaddr), "ipv6mr_multiaddr");
 
-       tprints("{ipv6mr_multiaddr=inet_pton(");
-       print_quoted_string(address, sizeof(address), QUOTE_0_TERMINATED);
-       tprints("), ipv6mr_interface=");
+       tprints(", ipv6mr_interface=");
        print_ifindex(mreq.ipv6mr_interface);
        tprints("}");
-       return;
-
-fail:
-       printstrn(tcp, addr, len);
 }
 #endif /* IPV6_ADD_MEMBERSHIP */
 
index 174108ca967002c33a7175c89a151942df2eb94f..0df4e8053edddd6055b5a025bff7f475417418ca 100644 (file)
@@ -81,6 +81,34 @@ print_sockaddr_data_un(const void *const buf, const int addrlen)
        }
 }
 
+bool
+print_inet_addr(const int af,
+               const void *const addr,
+               const unsigned int len,
+               const char *const var_name)
+{
+       const char *af_name = NULL;
+       char buf[INET6_ADDRSTRLEN];
+
+       switch (af) {
+       case AF_INET:
+               af_name = "AF_INET";
+               break;
+       case AF_INET6:
+               af_name = "AF_INET6";
+               break;
+       }
+
+       if (af_name && inet_ntop(af, addr, buf, sizeof(buf))) {
+               tprintf("inet_pton(%s, \"%s\", &%s)", af_name, buf, var_name);
+               return true;
+       } else {
+               tprintf("%s=", var_name);
+               print_quoted_string(addr, len, 0);
+               return false;
+       }
+}
+
 static void
 print_sockaddr_data_in(const void *const buf, const int addrlen)
 {
@@ -97,13 +125,10 @@ print_sockaddr_data_in6(const void *const buf, const int addrlen)
 {
        const struct sockaddr_in6 *const sa_in6 = buf;
 
-       char string_addr[100];
-       inet_ntop(AF_INET6, &sa_in6->sin6_addr,
-                 string_addr, sizeof(string_addr));
-       tprintf("sin6_port=htons(%u), inet_pton(AF_INET6"
-               ", \"%s\", &sin6_addr), sin6_flowinfo=htonl(%u)",
-               ntohs(sa_in6->sin6_port), string_addr,
-               ntohl(sa_in6->sin6_flowinfo));
+       tprintf("sin6_port=htons(%u), ", ntohs(sa_in6->sin6_port));
+       print_inet_addr(AF_INET6, &sa_in6->sin6_addr,
+                       sizeof(sa_in6->sin6_addr), "sin6_addr");
+       tprintf(", sin6_flowinfo=htonl(%u)", ntohl(sa_in6->sin6_flowinfo));
 
        if (addrlen <= (int) SIN6_MIN_LEN)
                return;
index 4bcda09fae8945a13d3ed4f1f26791e0e2102569..e437ec435f190fe22bbdcdbe4a4bf4a2ecb70e9b 100644 (file)
@@ -139,7 +139,7 @@ main(void)
                rc = setsockopt(0, SOL_IPV6, long_ipv6[i].optname,
                                m6, sizeof(*m6));
                printf("setsockopt(0, SOL_IPV6, %s"
-                      ", {ipv6mr_multiaddr=inet_pton(\"%s\")"
+                      ", {inet_pton(AF_INET6, \"%s\", &ipv6mr_multiaddr)"
                       ", ipv6mr_interface=if_nametoindex(\"lo\")}"
                       ", %u) = %s\n",
                       long_ipv6[i].str_optname, multi6addr,