]> granicus.if.org Git - strace/blobdiff - syscall.c
decode_poll_exiting: reserve more space in output buffer
[strace] / syscall.c
index b8f9f82a7ae7ebee66960254a1e19c2cde087d2e..6aa1cd2d17c00f801b8208dc7b8ab68e6d823fd5 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -81,7 +81,8 @@
 #define SI STACKTRACE_INVALIDATE_CACHE
 #define SE STACKTRACE_CAPTURE_ON_ENTER
 
-#define SEN(syscall_name) SYS_FUNC_NAME(syscall_name)
+#define SEN_NAME(syscall_name) SEN_ ## syscall_name
+#define SEN(syscall_name) SEN_NAME(syscall_name), SYS_FUNC_NAME(syscall_name)
 
 const struct_sysent sysent0[] = {
 #include "syscallent.h"
@@ -101,6 +102,7 @@ static const struct_sysent sysent2[] = {
 
 /* Now undef them since short defines cause wicked namespace pollution. */
 #undef SEN
+#undef SEN_NAME
 #undef TD
 #undef TF
 #undef TI
@@ -653,49 +655,56 @@ printargs_ld(struct tcb *tcp)
 static void
 dumpio(struct tcb *tcp)
 {
-       int (*func)();
+       int sen;
 
        if (syserror(tcp))
                return;
        if ((unsigned long) tcp->u_arg[0] >= num_quals)
                return;
-       func = tcp->s_ent->sys_func;
-       if (func == printargs)
+       sen = tcp->s_ent->sen;
+       if (SEN_printargs == sen)
                return;
        if (qual_flags[tcp->u_arg[0]] & QUAL_READ) {
-               if (func == sys_read ||
-                   func == sys_pread ||
-                   func == sys_recv ||
-                   func == sys_recvfrom) {
+               switch (sen) {
+               case SEN_read:
+               case SEN_pread:
+               case SEN_recv:
+               case SEN_recvfrom:
                        dumpstr(tcp, tcp->u_arg[1], tcp->u_rval);
                        return;
-               } else if (func == sys_readv) {
+               case SEN_readv:
                        dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
                        return;
 #ifdef HAVE_SENDMSG
-               } else if (func == sys_recvmsg) {
+               case SEN_recvmsg:
                        dumpiov_in_msghdr(tcp, tcp->u_arg[1]);
                        return;
-               } else if (func == sys_recvmmsg) {
+               case SEN_recvmmsg:
                        dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
                        return;
 #endif
                }
        }
        if (qual_flags[tcp->u_arg[0]] & QUAL_WRITE) {
-               if (func == sys_write ||
-                   func == sys_pwrite ||
-                   func == sys_send ||
-                   func == sys_sendto)
+               switch (sen) {
+               case SEN_write:
+               case SEN_pwrite:
+               case SEN_send:
+               case SEN_sendto:
                        dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
-               else if (func == sys_writev)
+                       break;
+               case SEN_writev:
                        dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
+                       break;
 #ifdef HAVE_SENDMSG
-               else if (func == sys_sendmsg)
+               case SEN_sendmsg:
                        dumpiov_in_msghdr(tcp, tcp->u_arg[1]);
-               else if (func == sys_sendmmsg)
+                       break;
+               case SEN_sendmmsg:
                        dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]);
+                       break;
 #endif
+               }
        }
 }
 
@@ -783,33 +792,30 @@ trace_syscall_entering(struct tcb *tcp)
        }
 
 #ifdef LINUX_MIPSO32
-       if (sys_syscall == tcp->s_ent->sys_func)
+       if (SEN_syscall == tcp->s_ent->sen)
                decode_mips_subcall(tcp);
 #endif
 
-       if (   sys_execve == tcp->s_ent->sys_func
+       if (   SEN_execve == tcp->s_ent->sen
 # if defined(SPARC) || defined(SPARC64)
-           || sys_execv == tcp->s_ent->sys_func
+           || SEN_execv == tcp->s_ent->sen
 # endif
           ) {
                hide_log_until_execve = 0;
        }
 
 #if defined(SYS_socket_subcall) || defined(SYS_ipc_subcall)
-       while (1) {
+       switch (tcp->s_ent->sen) {
 # ifdef SYS_socket_subcall
-               if (tcp->s_ent->sys_func == sys_socketcall) {
+               case SEN_socketcall:
                        decode_socket_subcall(tcp);
                        break;
-               }
 # endif
 # ifdef SYS_ipc_subcall
-               if (tcp->s_ent->sys_func == sys_ipc) {
+               case SEN_ipc:
                        decode_ipc_subcall(tcp);
                        break;
-               }
 # endif
-               break;
        }
 #endif
 
@@ -840,7 +846,7 @@ trace_syscall_entering(struct tcb *tcp)
                tprintf("%s(", undefined_scno_name(tcp));
        else
                tprintf("%s(", tcp->s_ent->sys_name);
-       if ((tcp->qual_flg & QUAL_RAW) && tcp->s_ent->sys_func != sys_exit)
+       if ((tcp->qual_flg & QUAL_RAW) && SEN_exit != tcp->s_ent->sen)
                res = printargs(tcp);
        else
                res = tcp->s_ent->sys_func(tcp);