]> granicus.if.org Git - strace/commitdiff
Implement sys_rt_tgsigqueueinfo syscall decoder
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 13 Mar 2012 15:51:13 +0000 (15:51 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 13 Mar 2012 15:51:13 +0000 (15:51 +0000)
* linux/dummy.h (sys_rt_tgsigqueueinfo): Remove.
* linux/syscall.h (sys_rt_tgsigqueueinfo): New prototype.
* signal.c (print_sigqueueinfo): New function, based on
sys_rt_sigqueueinfo.
(sys_rt_sigqueueinfo): Use print_sigqueueinfo.
(sys_rt_tgsigqueueinfo): New function.

linux/dummy.h
linux/syscall.h
signal.c

index 08b5b109e826be2bb82c414d6a74460f5ea7419f..3c5f901a0d0af0708bcb65ca9a2e996c290e198f 100644 (file)
@@ -44,7 +44,6 @@
 #define        sys_perf_event_open     printargs
 #define        sys_prlimit64           printargs
 #define        sys_request_key         printargs
-#define        sys_rt_tgsigqueueinfo   printargs
 #define        sys_sync_file_range     printargs
 #define        sys_sysfs               printargs
 #define        sys_vm86old             printargs
index b74c6c40874b23d5084003cf57d4b238851f5b1b..fb135661dfc6b0713c9112a34b15211b5347dfb3 100644 (file)
@@ -204,6 +204,7 @@ int sys_rt_sigprocmask();
 int sys_rt_sigqueueinfo();
 int sys_rt_sigsuspend();
 int sys_rt_sigtimedwait();
+int sys_rt_tgsigqueueinfo();
 int sys_sched_get_priority_min();
 int sys_sched_getaffinity();
 int sys_sched_getparam();
index baaac7cc7b53fce79fe53c6e9ece39d74f0b37d5..dc0064b76886fceafc59d15fb5a450204296c253 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -1437,18 +1437,35 @@ sys_rt_sigsuspend(struct tcb *tcp)
        return 0;
 }
 
+static void
+print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo)
+{
+       siginfo_t si;
+
+       printsignal(sig);
+       tprints(", ");
+       if (umove(tcp, uinfo, &si) < 0)
+               tprintf("%#lx", uinfo);
+       else
+               printsiginfo(&si, verbose(tcp));
+}
+
 int
 sys_rt_sigqueueinfo(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               siginfo_t si;
                tprintf("%lu, ", tcp->u_arg[0]);
-               printsignal(tcp->u_arg[1]);
-               tprints(", ");
-               if (umove(tcp, tcp->u_arg[2], &si) < 0)
-                       tprintf("%#lx", tcp->u_arg[2]);
-               else
-                       printsiginfo(&si, verbose(tcp));
+               print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+       }
+       return 0;
+}
+
+int
+sys_rt_tgsigqueueinfo(struct tcb *tcp)
+{
+       if (entering(tcp)) {
+               tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
+               print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
        }
        return 0;
 }