]> granicus.if.org Git - strace/blobdiff - sock.c
tests: check decoding of accept4 syscall
[strace] / sock.c
diff --git a/sock.c b/sock.c
index 97d8afa6ce6514e6efe374ea39150097ca4f4b02..cf13896bd0d3ea0858a2b19827bfb872ea2b8a3e 100644 (file)
--- a/sock.c
+++ b/sock.c
 
 #include "defs.h"
 #include <sys/socket.h>
+#if defined ALPHA || defined SH || defined SH64
+# include <linux/ioctl.h>
+#endif
 #include <linux/sockios.h>
 #include <arpa/inet.h>
-#if defined(ALPHA) || defined(SH) || defined(SH64)
-# if defined(HAVE_SYS_IOCTL_H)
-#  include <sys/ioctl.h>
-# elif defined(HAVE_IOCTLS_H)
-#  include <ioctls.h>
-# endif
-#endif
 #include <net/if.h>
 
 #include "xlat/iffflags.h"
 
-static void
-print_ifreq_addr(struct tcb *tcp, const struct ifreq *ifr, const long addr)
-{
-       tprintf("{");
-       printxval(addrfams, ifr->ifr_addr.sa_family, "AF_???");
-       tprints(", ");
-       if (ifr->ifr_addr.sa_family == AF_INET) {
-               const struct sockaddr_in *sinp =
-                       (struct sockaddr_in *) &ifr->ifr_addr;
-               tprintf("inet_addr(\"%s\")", inet_ntoa(sinp->sin_addr));
-       } else
-               printstr(tcp, addr + offsetof(struct ifreq, ifr_addr.sa_data),
-                        sizeof(ifr->ifr_addr.sa_data));
-       tprints("}");
-}
+#define PRINT_IFREQ_ADDR(tcp, ifr, sockaddr)                                   \
+       do {                                                                    \
+               tprints(#sockaddr "=");                                         \
+               print_sockaddr(tcp, &((ifr)->sockaddr),                         \
+                              sizeof((ifr)->sockaddr));                        \
+       } while (0)
 
 static void
 print_ifname(const char *ifname)
@@ -69,23 +56,19 @@ print_ifreq(struct tcb *tcp, const unsigned int code, const long arg,
        switch (code) {
        case SIOCSIFADDR:
        case SIOCGIFADDR:
-               tprints("ifr_addr=");
-               print_ifreq_addr(tcp, ifr, arg);
+               PRINT_IFREQ_ADDR(tcp, ifr, ifr_addr);
                break;
        case SIOCSIFDSTADDR:
        case SIOCGIFDSTADDR:
-               tprints("ifr_dstaddr=");
-               print_ifreq_addr(tcp, ifr, arg);
+               PRINT_IFREQ_ADDR(tcp, ifr, ifr_dstaddr);
                break;
        case SIOCSIFBRDADDR:
        case SIOCGIFBRDADDR:
-               tprints("ifr_broadaddr=");
-               print_ifreq_addr(tcp, ifr, arg);
+               PRINT_IFREQ_ADDR(tcp, ifr, ifr_broadaddr);
                break;
        case SIOCSIFNETMASK:
        case SIOCGIFNETMASK:
-               tprints("ifr_netmask=");
-               print_ifreq_addr(tcp, ifr, arg);
+               PRINT_IFREQ_ADDR(tcp, ifr, ifr_netmask);
                break;
        case SIOCSIFHWADDR:
        case SIOCGIFHWADDR: {
@@ -101,7 +84,7 @@ print_ifreq(struct tcb *tcp, const unsigned int code, const long arg,
        case SIOCSIFFLAGS:
        case SIOCGIFFLAGS:
                tprints("ifr_flags=");
-               printflags(iffflags, ifr->ifr_flags, "IFF_???");
+               printflags(iffflags, (unsigned short) ifr->ifr_flags, "IFF_???");
                break;
        case SIOCSIFMETRIC:
        case SIOCGIFMETRIC:
@@ -201,12 +184,7 @@ decode_ifconf(struct tcb *tcp, const long addr)
                tprints("{ifr_name=");
                print_ifname(ifra[i].ifr_name);
                tprints(", ");
-               if (verbose(tcp)) {
-                       tprints("ifr_addr=");
-                       print_ifreq_addr(tcp, &ifra[i],
-                                        addr + i * sizeof(ifra[0]));
-               } else
-                       tprints("...");
+               PRINT_IFREQ_ADDR(tcp, &ifra[i], ifr_addr);
                tprints("}");
        }
        if (i < nifra)
@@ -348,8 +326,3 @@ sock_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
 
        return RVAL_DECODED | 1;
 }
-
-SYS_FUNC(socketcall)
-{
-       return printargs(tcp);
-}