From: Dmitry V. Levin Date: Tue, 13 Mar 2012 15:51:13 +0000 (+0000) Subject: Implement sys_rt_tgsigqueueinfo syscall decoder X-Git-Tag: v4.7~109 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=297632be5cfba5d51fc027e518ad91cb40e71d0b;p=strace Implement sys_rt_tgsigqueueinfo syscall decoder * 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. --- diff --git a/linux/dummy.h b/linux/dummy.h index 08b5b109..3c5f901a 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -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 diff --git a/linux/syscall.h b/linux/syscall.h index b74c6c40..fb135661 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -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(); diff --git a/signal.c b/signal.c index baaac7cc..dc0064b7 100644 --- 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; }