From: Dmitry V. Levin Date: Wed, 22 Jun 2016 15:58:00 +0000 (+0000) Subject: Split print_sockaddr X-Git-Tag: v4.13~110 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42c5878867257a49d9550b3644c7f68490fa8ca1;p=strace Split print_sockaddr * net.c (sockaddr_buf_t): Remove. (sockaddr_printer): New type. (sa_printers): New array of sockaddr_printer. (print_sockaddr): Use it. Move printers of family specific sockaddr data to separate funcions. --- diff --git a/net.c b/net.c index a55fb640..4f177f5f 100644 --- a/net.c +++ b/net.c @@ -102,6 +102,35 @@ #include "xlat/af_packet_types.h" +static void +print_sockaddr_data_un(const void *const buf, const int addrlen) +{ + const struct sockaddr_un *const sa_un = buf; + + if (addrlen == 2) { + tprints("NULL"); + } else if (sa_un->sun_path[0]) { + tprints("sun_path="); + print_quoted_string(sa_un->sun_path, + sizeof(sa_un->sun_path) + 1, + QUOTE_0_TERMINATED); + } else { + tprints("sun_path=@"); + print_quoted_string(sa_un->sun_path + 1, + sizeof(sa_un->sun_path), + QUOTE_0_TERMINATED); + } +} + +static void +print_sockaddr_data_in(const void *const buf, const int addrlen) +{ + const struct sockaddr_in *const sa_in = buf; + + tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")", + ntohs(sa_in->sin_port), inet_ntoa(sa_in->sin_addr)); +} + static void print_ifindex(unsigned int ifindex) { @@ -118,140 +147,132 @@ print_ifindex(unsigned int ifindex) tprintf("%u", ifindex); } -typedef union { - char pad[128]; - struct sockaddr sa; - struct sockaddr_in sin; - struct sockaddr_un sau; - struct sockaddr_in6 sa6; - struct sockaddr_ipx sipx; - struct sockaddr_ll ll; - struct sockaddr_nl nl; -#ifdef HAVE_BLUETOOTH_BLUETOOTH_H - struct sockaddr_hci hci; - struct sockaddr_l2 l2; - struct sockaddr_rc rc; - struct sockaddr_sco sco; -#endif -} sockaddr_buf_t; - -void -print_sockaddr(struct tcb *tcp, const void *const buf, const int addrlen) +static void +print_sockaddr_data_in6(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(", "); - - switch (addr->sa.sa_family) { - case AF_UNIX: - if (addrlen == 2) { - tprints("NULL"); - } else if (addr->sau.sun_path[0]) { - tprints("sun_path="); - print_quoted_string(addr->sau.sun_path, - sizeof(addr->sau.sun_path) + 1, - QUOTE_0_TERMINATED); - } else { - tprints("sun_path=@"); - print_quoted_string(addr->sau.sun_path + 1, - sizeof(addr->sau.sun_path), - QUOTE_0_TERMINATED); - } - break; - case AF_INET: - tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")", - ntohs(addr->sin.sin_port), inet_ntoa(addr->sin.sin_addr)); - break; - - case AF_INET6: - { - char string_addr[100]; - inet_ntop(AF_INET6, &addr->sa6.sin6_addr, - string_addr, sizeof(string_addr)); - tprintf("sin6_port=htons(%u), inet_pton(AF_INET6" - ", \"%s\", &sin6_addr), sin6_flowinfo=%u", - ntohs(addr->sa6.sin6_port), string_addr, - addr->sa6.sin6_flowinfo); + 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=%u", + ntohs(sa_in6->sin6_port), string_addr, + sa_in6->sin6_flowinfo); #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID - tprints(", sin6_scope_id="); + tprints(", sin6_scope_id="); # 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 + if (IN6_IS_ADDR_LINKLOCAL(&sa_in6->sin6_addr) + || IN6_IS_ADDR_MC_LINKLOCAL(&sa_in6->sin6_addr)) + print_ifindex(sa_in6->sin6_scope_id); + else # endif - tprintf("%u", addr->sa6.sin6_scope_id); + tprintf("%u", sa_in6->sin6_scope_id); #endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */ - } - break; +} - case AF_IPX: - { - tprintf("sipx_port=htons(%u)" - ", sipx_network=htonl(%08x)" - ", sipx_node=[", - ntohs(addr->sipx.sipx_port), - ntohl(addr->sipx.sipx_network)); - int i; - for (i = 0; i < IPX_NODE_LEN; ++i) { - tprintf("%s%02x", i ? ", " : "", - addr->sipx.sipx_node[i]); - } - tprintf("], sipx_type=%02x", addr->sipx.sipx_type); - } - break; +static void +print_sockaddr_data_ipx(const void *const buf, const int addrlen) +{ + const struct sockaddr_ipx *const sa_ipx = buf; + unsigned int i; - case AF_PACKET: - { - int i; - tprintf("proto=%#04x, if%d, pkttype=", - ntohs(addr->ll.sll_protocol), - addr->ll.sll_ifindex); - printxval(af_packet_types, addr->ll.sll_pkttype, "PACKET_???"); - tprintf(", addr(%d)={%d, ", - addr->ll.sll_halen, - addr->ll.sll_hatype); - for (i = 0; i < addr->ll.sll_halen; i++) - tprintf("%02x", addr->ll.sll_addr[i]); - } - break; + tprintf("sipx_port=htons(%u)" + ", sipx_network=htonl(%08x)" + ", sipx_node=[", + ntohs(sa_ipx->sipx_port), + ntohl(sa_ipx->sipx_network)); + for (i = 0; i < IPX_NODE_LEN; ++i) { + tprintf("%s%02x", i ? ", " : "", + sa_ipx->sipx_node[i]); + } + tprintf("], sipx_type=%02x", sa_ipx->sipx_type); +} - case AF_NETLINK: - tprintf("pid=%d, groups=%08x", addr->nl.nl_pid, addr->nl.nl_groups); - break; +static void +print_sockaddr_data_nl(const void *const buf, const int addrlen) +{ + const struct sockaddr_nl *const sa_nl = buf; + + tprintf("pid=%d, groups=%08x", sa_nl->nl_pid, sa_nl->nl_groups); +} + +static void +print_sockaddr_data_ll(const void *const buf, const int addrlen) +{ + const struct sockaddr_ll *const sa_ll = buf; + unsigned int i; + + tprintf("proto=%#04x, if%d, pkttype=", + ntohs(sa_ll->sll_protocol), + sa_ll->sll_ifindex); + printxval(af_packet_types, sa_ll->sll_pkttype, "PACKET_???"); + tprintf(", addr(%d)={%d, ", sa_ll->sll_halen, sa_ll->sll_hatype); + for (i = 0; i < sa_ll->sll_halen; i++) + tprintf("%02x", sa_ll->sll_addr[i]); +} #ifdef HAVE_BLUETOOTH_BLUETOOTH_H - case AF_BLUETOOTH: - tprintf("{sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or " - "{rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or " - "{l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or " - "{hci_dev=htobs(%d)}", - addr->sco.sco_bdaddr.b[0], addr->sco.sco_bdaddr.b[1], - addr->sco.sco_bdaddr.b[2], addr->sco.sco_bdaddr.b[3], - addr->sco.sco_bdaddr.b[4], addr->sco.sco_bdaddr.b[5], - addr->rc.rc_bdaddr.b[0], addr->rc.rc_bdaddr.b[1], - addr->rc.rc_bdaddr.b[2], addr->rc.rc_bdaddr.b[3], - addr->rc.rc_bdaddr.b[4], addr->rc.rc_bdaddr.b[5], - addr->rc.rc_channel, - btohs(addr->l2.l2_psm), addr->l2.l2_bdaddr.b[0], - addr->l2.l2_bdaddr.b[1], addr->l2.l2_bdaddr.b[2], - addr->l2.l2_bdaddr.b[3], addr->l2.l2_bdaddr.b[4], - addr->l2.l2_bdaddr.b[5], btohs(addr->l2.l2_cid), - btohs(addr->hci.hci_dev)); - break; +static void +print_sockaddr_data_bt(const void *const buf, const int addrlen) +{ + const union { + struct sockaddr_hci hci; + struct sockaddr_l2 l2; + struct sockaddr_rc rc; + struct sockaddr_sco sco; + } *const addr = buf; + + tprintf("{sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or " + "{rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or " + "{l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or " + "{hci_dev=htobs(%d)}", + addr->sco.sco_bdaddr.b[0], addr->sco.sco_bdaddr.b[1], + addr->sco.sco_bdaddr.b[2], addr->sco.sco_bdaddr.b[3], + addr->sco.sco_bdaddr.b[4], addr->sco.sco_bdaddr.b[5], + addr->rc.rc_bdaddr.b[0], addr->rc.rc_bdaddr.b[1], + addr->rc.rc_bdaddr.b[2], addr->rc.rc_bdaddr.b[3], + addr->rc.rc_bdaddr.b[4], addr->rc.rc_bdaddr.b[5], + addr->rc.rc_channel, + btohs(addr->l2.l2_psm), addr->l2.l2_bdaddr.b[0], + addr->l2.l2_bdaddr.b[1], addr->l2.l2_bdaddr.b[2], + addr->l2.l2_bdaddr.b[3], addr->l2.l2_bdaddr.b[4], + addr->l2.l2_bdaddr.b[5], btohs(addr->l2.l2_cid), + btohs(addr->hci.hci_dev)); +} #endif /* HAVE_BLUETOOTH_BLUETOOTH_H */ - /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5 - AF_X25 AF_ROSE etc. still need to be done */ +typedef void (* const sockaddr_printer)(const void *const, const int); - default: +static const sockaddr_printer sa_printers[] = { + [AF_UNIX] = print_sockaddr_data_un, + [AF_INET] = print_sockaddr_data_in, + [AF_IPX] = print_sockaddr_data_ipx, + [AF_INET6] = print_sockaddr_data_in6, + [AF_NETLINK] = print_sockaddr_data_nl, + [AF_PACKET] = print_sockaddr_data_ll, +#ifdef HAVE_BLUETOOTH_BLUETOOTH_H + [AF_BLUETOOTH] = print_sockaddr_data_bt, +#endif +}; + +void +print_sockaddr(struct tcb *tcp, const void *const buf, const int addrlen) +{ + const struct sockaddr *const sa = buf; + const unsigned short family = sa->sa_family; + + tprints("{sa_family="); + printxval(addrfams, family, "AF_???"); + tprints(", "); + + if (family < ARRAY_SIZE(sa_printers) && sa_printers[family]) { + sa_printers[family](buf, addrlen); + } else { tprints("sa_data="); - print_quoted_string(addr->sa.sa_data, - sizeof(addr->sa.sa_data), 0); - break; + print_quoted_string(sa->sa_data, sizeof(sa->sa_data), 0); } + tprints("}"); }