]> granicus.if.org Git - strace/blobdiff - net.c
CREDITS.in: use UTF-8 consistently
[strace] / net.c
diff --git a/net.c b/net.c
index 257e0df3fc174868119ae0a02dede1b9254221ba..34a394dba8f3ee447a865429cda7befdbaf52523 100644 (file)
--- a/net.c
+++ b/net.c
 # include "xlat/bt_protocols.h"
 #endif
 
-void
-print_ifindex(unsigned int ifindex)
-{
-#ifdef HAVE_IF_INDEXTONAME
-       char buf[IFNAMSIZ + 1];
-
-       if (if_indextoname(ifindex, buf)) {
-               tprints("if_nametoindex(");
-               print_quoted_string(buf, sizeof(buf), QUOTE_0_TERMINATED);
-               tprints(")");
-               return;
-       }
-#endif
-       tprintf("%u", ifindex);
-}
-
 static void
 decode_sockbuf(struct tcb *const tcp, const int fd, const kernel_ulong_t addr,
               const kernel_ulong_t addrlen)
@@ -168,26 +152,6 @@ SYS_FUNC(socket)
        return RVAL_DECODED | RVAL_FD;
 }
 
-SYS_FUNC(bind)
-{
-       printfd(tcp, tcp->u_arg[0]);
-       tprints(", ");
-       const int addrlen = tcp->u_arg[2];
-       decode_sockaddr(tcp, tcp->u_arg[1], addrlen);
-       tprintf(", %d", addrlen);
-
-       return RVAL_DECODED;
-}
-
-SYS_FUNC(listen)
-{
-       printfd(tcp, tcp->u_arg[0]);
-       tprints(", ");
-       tprintf("%" PRI_klu, tcp->u_arg[1]);
-
-       return RVAL_DECODED;
-}
-
 static bool
 fetch_socklen(struct tcb *const tcp, int *const plen,
              const kernel_ulong_t sockaddr, const kernel_ulong_t socklen)
@@ -349,17 +313,6 @@ SYS_FUNC(recvfrom)
        return 0;
 }
 
-#include "xlat/shutdown_modes.h"
-
-SYS_FUNC(shutdown)
-{
-       printfd(tcp, tcp->u_arg[0]);
-       tprints(", ");
-       printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
-
-       return RVAL_DECODED;
-}
-
 SYS_FUNC(getsockname)
 {
        return decode_sockname(tcp);
@@ -490,19 +443,17 @@ print_sockopt_fd_level_name(struct tcb *tcp, int fd, unsigned int level,
 
 static void
 print_set_linger(struct tcb *const tcp, const kernel_ulong_t addr,
-                const unsigned int len)
+                const int len)
 {
        struct linger linger;
 
-       if (len < sizeof(linger) ||
-           umove(tcp, addr, &linger) < 0) {
+       if (len < (int) sizeof(linger)) {
                printaddr(addr);
-               return;
+       } else if (!umove_or_printaddr(tcp, addr, &linger)) {
+               PRINT_FIELD_D("{", linger, l_onoff);
+               PRINT_FIELD_D(", ", linger, l_linger);
+               tprints("}");
        }
-
-       PRINT_FIELD_D("{", linger, l_onoff);
-       PRINT_FIELD_D(", ", linger, l_linger);
-       tprints("}");
 }
 
 static void
@@ -533,19 +484,31 @@ print_get_linger(struct tcb *const tcp, const kernel_ulong_t addr,
 
 #ifdef SO_PEERCRED
 static void
-print_ucred(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
+print_ucred(struct tcb *const tcp, const kernel_ulong_t addr, unsigned int len)
 {
        struct ucred uc;
 
-       if (len != sizeof(uc) ||
-           umove(tcp, addr, &uc) < 0) {
-               printaddr(addr);
+       if (len < sizeof(uc)) {
+               if (len != sizeof(uc.pid)
+                   && len != offsetofend(struct ucred, uid)) {
+                       printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX);
+                       return;
+               }
        } else {
-               tprintf("{pid=%u, uid=%u, gid=%u}",
-                       (unsigned) uc.pid,
-                       (unsigned) uc.uid,
-                       (unsigned) uc.gid);
+               len = sizeof(uc);
+       }
+
+       if (umoven(tcp, addr, len, &uc) < 0) {
+               printaddr(addr);
+               return;
        }
+
+       PRINT_FIELD_D("{", uc, pid);
+       if (len > sizeof(uc.pid))
+               PRINT_FIELD_UID(", ", uc, uid);
+       if (len == sizeof(uc))
+               PRINT_FIELD_UID(", ", uc, gid);
+       tprints("}");
 }
 #endif /* SO_PEERCRED */
 
@@ -560,9 +523,9 @@ print_tpacket_stats(struct tcb *const tcp, const kernel_ulong_t addr,
            umove(tcp, addr, &stats) < 0) {
                printaddr(addr);
        } else {
-               tprintf("{packets=%u, drops=%u}",
-                       stats.tp_packets,
-                       stats.tp_drops);
+               PRINT_FIELD_U("{", stats, tp_packets);
+               PRINT_FIELD_U("{", stats, tp_drops);
+               tprints("}");
        }
 }
 #endif /* PACKET_STATISTICS */
@@ -688,66 +651,36 @@ SYS_FUNC(getsockopt)
 #ifdef IP_ADD_MEMBERSHIP
 static void
 print_mreq(struct tcb *const tcp, const kernel_ulong_t addr,
-          const unsigned int len)
+          const int len)
 {
        struct ip_mreq mreq;
 
-       if (len < sizeof(mreq)) {
-               printstrn(tcp, addr, len);
-               return;
+       if (len < (int) sizeof(mreq)) {
+               printaddr(addr);
+       } else if (!umove_or_printaddr(tcp, addr, &mreq)) {
+               PRINT_FIELD_INET4_ADDR("{", mreq, imr_multiaddr);
+               PRINT_FIELD_INET4_ADDR(", ", mreq, imr_interface);
+               tprints("}");
        }
-       if (umove_or_printaddr(tcp, addr, &mreq))
-               return;
-
-       tprintf("{imr_multiaddr=inet_addr(\"%s\")",
-               inet_ntoa(mreq.imr_multiaddr));
-       tprintf(", imr_interface=inet_addr(\"%s\")}",
-               inet_ntoa(mreq.imr_interface));
 }
 #endif /* IP_ADD_MEMBERSHIP */
 
 #ifdef IPV6_ADD_MEMBERSHIP
 static void
 print_mreq6(struct tcb *const tcp, const kernel_ulong_t addr,
-           const unsigned int len)
+           const int len)
 {
        struct ipv6_mreq mreq;
 
-       if (len < sizeof(mreq)) {
-               printstrn(tcp, addr, len);
-               return;
-       }
-       if (umove_or_printaddr(tcp, addr, &mreq))
-               return;
-
-       tprints("{");
-       print_inet_addr(AF_INET6, &mreq.ipv6mr_multiaddr,
-                       sizeof(mreq.ipv6mr_multiaddr), "ipv6mr_multiaddr");
-
-       tprints(", ipv6mr_interface=");
-       print_ifindex(mreq.ipv6mr_interface);
-       tprints("}");
-}
-#endif /* IPV6_ADD_MEMBERSHIP */
-
-#ifdef MCAST_JOIN_GROUP
-static void
-print_group_req(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
-{
-       struct group_req greq;
-
-       if (len != sizeof(greq) ||
-           umove(tcp, addr, &greq) < 0) {
+       if (len < (int) sizeof(mreq)) {
                printaddr(addr);
-               return;
+       } else if (!umove_or_printaddr(tcp, addr, &mreq)) {
+               PRINT_FIELD_INET_ADDR("{", mreq, ipv6mr_multiaddr, AF_INET6);
+               PRINT_FIELD_IFINDEX(", ", mreq, ipv6mr_interface);
+               tprints("}");
        }
-
-       tprintf("{gr_interface=%u, gr_group=", greq.gr_interface);
-       print_sockaddr(tcp, &greq.gr_group, sizeof(greq.gr_group));
-       tprints("}");
-
 }
-#endif /* MCAST_JOIN_GROUP */
+#endif /* IPV6_ADD_MEMBERSHIP */
 
 #ifdef PACKET_RX_RING
 static void
@@ -759,12 +692,11 @@ print_tpacket_req(struct tcb *const tcp, const kernel_ulong_t addr, const int le
            umove(tcp, addr, &req) < 0) {
                printaddr(addr);
        } else {
-               tprintf("{block_size=%u, block_nr=%u, "
-                       "frame_size=%u, frame_nr=%u}",
-                       req.tp_block_size,
-                       req.tp_block_nr,
-                       req.tp_frame_size,
-                       req.tp_frame_nr);
+               PRINT_FIELD_U("{", req, tp_block_size);
+               PRINT_FIELD_U(", ", req, tp_block_nr);
+               PRINT_FIELD_U(", ", req, tp_frame_size);
+               PRINT_FIELD_U(", ", req, tp_frame_nr);
+               tprints("}");
        }
 }
 #endif /* PACKET_RX_RING */
@@ -783,9 +715,11 @@ print_packet_mreq(struct tcb *const tcp, const kernel_ulong_t addr, const int le
        } else {
                unsigned int i;
 
-               tprintf("{mr_ifindex=%u, mr_type=", mreq.mr_ifindex);
-               printxval(packet_mreq_type, mreq.mr_type, "PACKET_MR_???");
-               tprintf(", mr_alen=%u, mr_address=", mreq.mr_alen);
+               PRINT_FIELD_IFINDEX("{", mreq, mr_ifindex);
+               PRINT_FIELD_XVAL(", ", mreq, mr_type, packet_mreq_type,
+                                "PACKET_MR_???");
+               PRINT_FIELD_U(", ", mreq, mr_alen);
+               tprints(", mr_address=");
                if (mreq.mr_alen > ARRAY_SIZE(mreq.mr_address))
                        mreq.mr_alen = ARRAY_SIZE(mreq.mr_address);
                for (i = 0; i < mreq.mr_alen; ++i)
@@ -852,6 +786,12 @@ print_setsockopt(struct tcb *const tcp, const unsigned int level,
                        print_mreq6(tcp, addr, len);
                        return;
 #endif /* IPV6_ADD_MEMBERSHIP */
+#ifdef MCAST_JOIN_GROUP
+               case MCAST_JOIN_GROUP:
+               case MCAST_LEAVE_GROUP:
+                       print_group_req(tcp, addr, len);
+                       return;
+#endif /* MCAST_JOIN_GROUP */
                }
                break;