Before this patch:

27192 rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], 0x8cb4594) = -1 
EAGAIN (Resource temporarily unavailable)
                                                          ^^^^^^^^^ wrong (must 
be 0)! also, rest is not decoded
27192 rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], 0x8cb4594) = -1 
EAGAIN (Resource temporarily unavailable)
27192 rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], 0, 0x80ed85c, 8) = 2
                                                             ^^^^^^^^^ timespec 
is not decoded
27192 rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], 0x8cb4594) = -1 
EAGAIN (Resource temporarily unavailable)
27192 rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], 0x8cb4594) = -1 
EAGAIN (Resource temporarily unavailable)

After:

rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], NULL, {0, 0}, 8) = -1 
EAGAIN (Resource temporarily unavailable)
rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], NULL, {0, 0}, 8) = -1 
EAGAIN (Resource temporarily unavailable)
rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], NULL, {0, 0}, 8) = 2
rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], NULL, {0, 0}, 8) = -1 
EAGAIN (Resource temporarily unavailable)
rt_sigtimedwait([HUP INT QUIT TERM TSTP TTIN TTOU], NULL, {0, 0}, 8) = -1 
EAGAIN (Resource temporarily unavailable)

Changelog:

        * signal.c (sys_rt_sigtimedwait): Fix siginfo display,
        show timespec and sigset length too.

--
vda


diff -d -urpN strace.4/signal.c strace.5/signal.c
--- strace.4/signal.c   2009-03-31 17:29:09.000000000 +0200
+++ strace.5/signal.c   2009-03-31 17:29:16.000000000 +0200
@@ -2032,21 +2032,32 @@ int sys_rt_sigtimedwait(struct tcb *tcp)
                else
                        printsigmask(&sigset, 1);
                tprintf(", ");
+               /* This is the only "return" parameter, */
+               if (tcp->u_arg[1] != 0)
+                       return 0;
+               /* ... if it's NULL, can decode all on entry */
+               tprintf("NULL, ");
        }
-       else {
+       else if (tcp->u_arg[1] != 0) {
+               /* syscall exit, and u_arg[1] wasn't NULL */
                if (syserror(tcp))
-                       tprintf("%#lx", tcp->u_arg[0]);
+                       tprintf("%#lx, ", tcp->u_arg[1]);
                else {
                        siginfo_t si;
                        if (umove(tcp, tcp->u_arg[1], &si) < 0)
-                               tprintf("%#lx", tcp->u_arg[1]);
-                       else
+                               tprintf("%#lx, ", tcp->u_arg[1]);
+                       else {
                                printsiginfo(&si, verbose(tcp));
-                       /* XXX For now */
-                       tprintf(", %#lx", tcp->u_arg[2]);
-                       tprintf(", %d", (int) tcp->u_arg[3]);
+                               tprintf(", ");
+                       }
                }
        }
+       else {
+               /* syscall exit, and u_arg[1] was NULL */
+               return 0;
+       }
+       print_timespec(tcp, tcp->u_arg[2]);
+       tprintf(", %d", (int) tcp->u_arg[3]);
        return 0;
 };
 



------------------------------------------------------------------------------
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to