diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2015-03-26 13:03:25 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2015-03-26 15:43:07 +0000 |
commit | 174bb2b36ec7b4c922331ff52681d79eac7add2e (patch) | |
tree | 802dfb23a7431674d40b3fef8d46c7273bbb7eaa | |
parent | b6ef71b6f487062689f320161ce7c1966dd2ac65 (diff) | |
download | android_external_strace-174bb2b36ec7b4c922331ff52681d79eac7add2e.tar.gz android_external_strace-174bb2b36ec7b4c922331ff52681d79eac7add2e.tar.bz2 android_external_strace-174bb2b36ec7b4c922331ff52681d79eac7add2e.zip |
signal.c: move sigaltstack parser to a separate file
* sigaltstack.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* signal.c (print_stack_t, sys_sigaltstack): Move to sigaltstack.c.
* xlat/sigaltstack_flags.in: Add default values.
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | sigaltstack.c | 53 | ||||
-rw-r--r-- | signal.c | 59 | ||||
-rw-r--r-- | xlat/sigaltstack_flags.in | 4 |
4 files changed, 56 insertions, 61 deletions
diff --git a/Makefile.am b/Makefile.am index 9c4237de..c4c0138b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -92,6 +92,7 @@ strace_SOURCES = \ sched.c \ scsi.c \ seccomp.c \ + sigaltstack.c \ signal.c \ sigreturn.c \ sock.c \ diff --git a/sigaltstack.c b/sigaltstack.c new file mode 100644 index 00000000..feba59b2 --- /dev/null +++ b/sigaltstack.c @@ -0,0 +1,53 @@ +#include "defs.h" +#include "xlat/sigaltstack_flags.h" + +static void +print_stack_t(struct tcb *tcp, unsigned long addr) +{ + stack_t ss; + int r; + + if (!addr) { + tprints("NULL"); + return; + } + +#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 + if (current_wordsize != sizeof(ss.ss_sp) && current_wordsize == 4) { + struct { + uint32_t ss_sp; + int32_t ss_flags; + uint32_t ss_size; + } ss32; + r = umove(tcp, addr, &ss32); + if (r >= 0) { + memset(&ss, 0, sizeof(ss)); + ss.ss_sp = (void*)(unsigned long) ss32.ss_sp; + ss.ss_flags = ss32.ss_flags; + ss.ss_size = (unsigned long) ss32.ss_size; + } + } else +#endif + { + r = umove(tcp, addr, &ss); + } + if (r < 0) { + tprintf("%#lx", addr); + } else { + tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp); + printflags(sigaltstack_flags, ss.ss_flags, "SS_???"); + tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size); + } +} + +int +sys_sigaltstack(struct tcb *tcp) +{ + if (entering(tcp)) { + print_stack_t(tcp, tcp->u_arg[0]); + } else { + tprints(", "); + print_stack_t(tcp, tcp->u_arg[1]); + } + return 0; +} @@ -681,65 +681,6 @@ sys_sigsuspend(struct tcb *tcp) return 0; } -#if !defined SS_ONSTACK -#define SS_ONSTACK 1 -#define SS_DISABLE 2 -#endif - -#include "xlat/sigaltstack_flags.h" - -static void -print_stack_t(struct tcb *tcp, unsigned long addr) -{ - stack_t ss; - int r; - - if (!addr) { - tprints("NULL"); - return; - } - -#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 - if (current_wordsize != sizeof(ss.ss_sp) && current_wordsize == 4) { - struct { - uint32_t ss_sp; - int32_t ss_flags; - uint32_t ss_size; - } ss32; - r = umove(tcp, addr, &ss32); - if (r >= 0) { - memset(&ss, 0, sizeof(ss)); - ss.ss_sp = (void*)(unsigned long) ss32.ss_sp; - ss.ss_flags = ss32.ss_flags; - ss.ss_size = (unsigned long) ss32.ss_size; - } - } else -#endif - { - r = umove(tcp, addr, &ss); - } - if (r < 0) { - tprintf("%#lx", addr); - } else { - tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp); - printflags(sigaltstack_flags, ss.ss_flags, "SS_???"); - tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size); - } -} - -int -sys_sigaltstack(struct tcb *tcp) -{ - if (entering(tcp)) { - print_stack_t(tcp, tcp->u_arg[0]); - } - else { - tprints(", "); - print_stack_t(tcp, tcp->u_arg[1]); - } - return 0; -} - #ifdef HAVE_SIGACTION /* "Old" sigprocmask, which operates with word-sized signal masks */ diff --git a/xlat/sigaltstack_flags.in b/xlat/sigaltstack_flags.in index c27a9310..376ec183 100644 --- a/xlat/sigaltstack_flags.in +++ b/xlat/sigaltstack_flags.in @@ -1,2 +1,2 @@ -SS_ONSTACK -SS_DISABLE +SS_ONSTACK 1 +SS_DISABLE 2 |