From: Dmitry V. Levin Date: Thu, 15 Jun 2017 21:02:14 +0000 (+0000) Subject: Introduce print_inet_addr X-Git-Tag: v4.18~84 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bd70a9c411d42bba06ff0438d5405da2f2ebdc32;p=strace Introduce print_inet_addr * 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. --- diff --git a/defs.h b/defs.h index f7d25f0c..9dbb6436 100644 --- 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 dba8a220..c254deb9 100644 --- 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 */ diff --git a/sockaddr.c b/sockaddr.c index 174108ca..0df4e805 100644 --- a/sockaddr.c +++ b/sockaddr.c @@ -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; diff --git a/tests/ip_mreq.c b/tests/ip_mreq.c index 4bcda09f..e437ec43 100644 --- a/tests/ip_mreq.c +++ b/tests/ip_mreq.c @@ -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,