* 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.
#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);
{
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 */
}
}
+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)
{
{
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;
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,