]> granicus.if.org Git - strace/commitdiff
Split print_sockaddr
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 22 Jun 2016 15:58:00 +0000 (15:58 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 22 Jun 2016 15:58:00 +0000 (15:58 +0000)
* 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.

net.c

diff --git a/net.c b/net.c
index a55fb640d4c79050dab27b8ce38d692feb666937..4f177f5f4bc6d98de574ee58c7539d325542a61c 100644 (file)
--- a/net.c
+++ b/net.c
 
 #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("}");
 }