📄 signal.c
字号:
printsigmask(&sigm, 0);#ifndef USE_PROCFS if ((tcp->u_arg[0] & sigmask(SIGTRAP))) { /* Mark attempt to block SIGTRAP */ tcp->flags |= TCB_SIGTRAPPED; /* Send unblockable signal */ kill(tcp->pid, SIGSTOP); }#endif /* !USE_PROCFS */ } else if (!syserror(tcp)) { sigset_t sigm; long_to_sigset(tcp->u_rval, &sigm); tcp->auxstr = sprintsigmask("old mask ", &sigm, 0); return RVAL_HEX | RVAL_STR; } return 0;}intsys_sigblock(tcp)struct tcb *tcp;{ return sys_sigsetmask(tcp);}#endif /* !SVR4 */#ifdef HAVE_SIGACTION#ifdef LINUXstruct old_sigaction { __sighandler_t __sa_handler; unsigned long sa_mask; unsigned long sa_flags; void (*sa_restorer)(void);};#define SA_HANDLER __sa_handler#endif /* LINUX */#ifndef SA_HANDLER #define SA_HANDLER sa_handler #endifintsys_sigaction(tcp)struct tcb *tcp;{ long addr;#ifdef LINUX sigset_t sigset; struct old_sigaction sa;#else struct sigaction sa;#endif if (entering(tcp)) { printsignal(tcp->u_arg[0]); tprintf(", "); addr = tcp->u_arg[1]; } else addr = tcp->u_arg[2]; if (addr == 0) tprintf("NULL"); else if (!verbose(tcp)) tprintf("%#lx", addr); else if (umove(tcp, addr, &sa) < 0) tprintf("{...}"); else { switch ((long) sa.SA_HANDLER) { case (long) SIG_ERR: tprintf("{SIG_ERR}"); break; case (long) SIG_DFL: tprintf("{SIG_DFL}"); break; case (long) SIG_IGN:#ifndef USE_PROCFS if (tcp->u_arg[0] == SIGTRAP) { tcp->flags |= TCB_SIGTRAPPED; kill(tcp->pid, SIGSTOP); }#endif /* !USE_PROCFS */ tprintf("{SIG_IGN}"); break; default:#ifndef USE_PROCFS if (tcp->u_arg[0] == SIGTRAP) { tcp->flags |= TCB_SIGTRAPPED; kill(tcp->pid, SIGSTOP); }#endif /* !USE_PROCFS */ tprintf("{%#lx, ", (long) sa.SA_HANDLER);#ifndef LINUX printsigmask (&sa.sa_mask, 0);#else long_to_sigset(sa.sa_mask, &sigset); printsigmask(&sigset, 0);#endif tprintf(", "); if (!printflags(sigact_flags, sa.sa_flags)) tprintf("0"); tprintf("}"); } } if (entering(tcp)) tprintf(", ");#ifdef LINUX else tprintf(", %#lx", (unsigned long) sa.sa_restorer);#endif return 0;}intsys_signal(tcp)struct tcb *tcp;{ if (entering(tcp)) { printsignal(tcp->u_arg[0]); tprintf(", "); switch (tcp->u_arg[1]) { case (int) SIG_ERR: tprintf("SIG_ERR"); break; case (int) SIG_DFL: tprintf("SIG_DFL"); break; case (int) SIG_IGN:#ifndef USE_PROCFS if (tcp->u_arg[0] == SIGTRAP) { tcp->flags |= TCB_SIGTRAPPED; kill(tcp->pid, SIGSTOP); }#endif /* !USE_PROCFS */ tprintf("SIG_IGN"); break; default:#ifndef USE_PROCFS if (tcp->u_arg[0] == SIGTRAP) { tcp->flags |= TCB_SIGTRAPPED; kill(tcp->pid, SIGSTOP); }#endif /* !USE_PROCFS */ tprintf("%#lx", tcp->u_arg[1]); } return 0; } else { switch (tcp->u_rval) { case (int) SIG_ERR: tcp->auxstr = "SIG_ERR"; break; case (int) SIG_DFL: tcp->auxstr = "SIG_DFL"; break; case (int) SIG_IGN: tcp->auxstr = "SIG_IGN"; break; default: tcp->auxstr = NULL; } return RVAL_HEX | RVAL_STR; }}intsys_sighold(tcp)struct tcb *tcp;{ if (entering(tcp)) { printsignal(tcp->u_arg[0]); } return 0;}#endif /* HAVE_SIGACTION */#ifdef LINUXintsys_sigreturn(tcp)struct tcb *tcp;{#ifdef S390 long usp; struct sigcontext_struct sc; if (entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid,PT_GPR15,&usp)<0) return 0; if (umove(tcp, usp+__SIGNAL_FRAMESIZE, &sc) < 0) return 0; tcp->u_arg[0] = 1; memcpy(&tcp->u_arg[1],&sc.oldmask[0],sizeof(sigset_t)); } else { tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ",(sigset_t *)&tcp->u_arg[1]); return RVAL_NONE | RVAL_STR; } return 0;#else#ifdef I386 long esp; struct sigcontext_struct sc; if (entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid, 4*UESP, &esp) < 0) return 0; if (umove(tcp, esp, &sc) < 0) return 0; tcp->u_arg[0] = 1; tcp->u_arg[1] = sc.oldmask; } else { sigset_t sigm; long_to_sigset(tcp->u_arg[1], &sigm); tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else /* !I386 */#ifdef IA64 struct sigcontext sc; long sp; if (entering(tcp)) { /* offset of sigcontext in the kernel's sigframe structure: */# define SIGFRAME_SC_OFFSET 0x90 tcp->u_arg[0] = 0; if (upeek(tcp->pid, PT_R12, &sp) < 0) return 0; if (umove(tcp, sp + 16 + SIGFRAME_SC_OFFSET, &sc) < 0) return 0; tcp->u_arg[0] = 1; memcpy(tcp->u_arg + 1, &sc.sc_mask, sizeof(sc.sc_mask)); } else { sigset_t sigm; memcpy(&sigm, tcp->u_arg + 1, sizeof (sigm)); tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else /* !IA64 */#ifdef POWERPC long esp; struct sigcontext_struct sc; if (entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid, 4*PT_R1, &esp) < 0) return 0; if (umove(tcp, esp, &sc) < 0) return 0; tcp->u_arg[0] = 1; tcp->u_arg[1] = sc.oldmask; } else { sigset_t sigm; long_to_sigset(tcp->u_arg[1], &sigm); tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else /* !POWERPC */#ifdef M68K long usp; struct sigcontext sc; if (entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid, 4*PT_USP, &usp) < 0) return 0; if (umove(tcp, usp, &sc) < 0) return 0; tcp->u_arg[0] = 1; tcp->u_arg[1] = sc.sc_mask; } else { sigset_t sigm; long_to_sigset(tcp->u_arg[1], &sigm); tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else /* !M68K */#ifdef ALPHA long fp; struct sigcontext_struct sc; if (entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid, REG_FP, &fp) < 0) return 0; if (umove(tcp, fp, &sc) < 0) return 0; tcp->u_arg[0] = 1; tcp->u_arg[1] = sc.sc_mask; } else { sigset_t sigm; long_to_sigset(tcp->u_arg[1], &sigm); tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else#ifdef SPARC long i1; struct regs regs; m_siginfo_t si; if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) { perror("sigreturn: PTRACE_GETREGS "); return 0; } if(entering(tcp)) { tcp->u_arg[0] = 0; i1 = regs.r_o1; if(umove(tcp, i1, &si) < 0) { perror("sigreturn: umove "); return 0; } tcp->u_arg[0] = 1; tcp->u_arg[1] = si.si_mask; } else { sigset_t sigm; long_to_sigset(tcp->u_arg[1], &sigm); tcp->u_rval = tcp->u_error = 0; if(tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", &sigm, 0); return RVAL_NONE | RVAL_STR; } return 0;#else #ifdef MIPS long sp; struct sigcontext sc; if(entering(tcp)) { tcp->u_arg[0] = 0; if (upeek(tcp->pid, REG_SP, &sp) < 0) return 0; if (umove(tcp, sp, &sc) < 0) return 0; tcp->u_arg[0] = 1; tcp->u_arg[1] = sc.sc_sigset; } else { tcp->u_rval = tcp->u_error = 0; if(tcp->u_arg[0] == 0) return 0; tcp->auxstr = sprintsigmask("mask now ", tcp->u_arg[1]); return RVAL_NONE | RVAL_STR; } return 0;#else#ifdef HPPA#warning NO sys_sigreturn DECODE FOR HPPA return 0;#endif /* HPPA */#endif /* MIPS */#endif /* SPARC */#endif /* ALPHA */#endif /* !M68K */#endif /* !POWERPC */#endif /* !IA64 */#endif /* !I386 */#endif /* S390 */}intsys_siggetmask(tcp)struct tcb *tcp;{ if (exiting(tcp)) { sigset_t sigm; long_to_sigset(tcp->u_rval, &sigm); tcp->auxstr = sprintsigmask("mask ", &sigm, 0); } return RVAL_HEX | RVAL_STR;}intsys_sigsuspend(tcp)struct tcb *tcp;{ if (entering(tcp)) { sigset_t sigm; long_to_sigset(tcp->u_arg[2], &sigm);#if 0 /* first two are not really arguments, but print them anyway */ /* nevermind, they are an anachronism now, too bad... */ tprintf("%d, %#x, ", tcp->u_arg[0], tcp->u_arg[1]);#endif printsigmask(&sigm, 0); } return 0;}#endif /* LINUX */#if defined(SVR4) || defined(FREEBSD)intsys_sigsuspend(tcp)struct tcb *tcp;{ sigset_t sigset; if (entering(tcp)) { if (umove(tcp, tcp->u_arg[0], &sigset) < 0) tprintf("[?]"); else printsigmask(&sigset, 0); } return 0;}#ifndef FREEBSDstatic struct xlat ucontext_flags[] = { { UC_SIGMASK, "UC_SIGMASK" }, { UC_STACK, "UC_STACK" }, { UC_CPU, "UC_CPU" },#ifdef UC_FPU { UC_FPU, "UC_FPU" },#endif#ifdef UC_INTR { UC_INTR, "UC_INTR" },#endif { 0, NULL },};#endif /* !FREEBSD */#endif /* SVR4 || FREEBSD */#if defined SVR4 || defined LINUX || defined FREEBSD#if defined LINUX && !defined SS_ONSTACK#define SS_ONSTACK 1#define SS_DISABLE 2#if __GLIBC_MINOR__ == 0typedef struct{ __ptr_t ss_sp; int ss_flags; size_t ss_size;} stack_t;#endif#endif#ifdef FREEBSD#define stack_t struct sigaltstack#endifstatic struct xlat sigaltstack_flags[] = { { SS_ONSTACK, "SS_ONSTACK" }, { SS_DISABLE, "SS_DISABLE" }, { 0, NULL },};#endif#ifdef SVR4static voidprintcontext(tcp, ucp)struct tcb *tcp;ucontext_t *ucp;{ tprintf("{"); if (!abbrev(tcp)) { tprintf("uc_flags="); if (!printflags(ucontext_flags, ucp->uc_flags)) tprintf("0"); tprintf(", uc_link=%#lx, ", (unsigned long) ucp->uc_link); } tprintf("uc_sigmask="); printsigmask(ucp->uc_sigmask, 0); if (!abbrev(tcp)) { tprintf(", uc_stack={ss_sp=%#lx, ss_size=%d, ss_flags=", (unsigned long) ucp->uc_stack.ss_sp, ucp->uc_stack.ss_size); if (!printflags(sigaltstack_flags, ucp->uc_stack.ss_flags)) tprintf("0"); tprintf("}"); } tprintf(", ...}");}intsys_getcontext(tcp)struct tcb *tcp;{ ucontext_t uc; if (exiting(tcp)) { if (tcp->u_error) tprintf("%#lx", tcp->u_arg[0]); else if (!tcp->u_arg[0]) tprintf("NULL"); else if (umove(tcp, tcp->u_arg[0], &uc) < 0) tprintf("{...}"); else printcontext(tcp, &uc); } return 0;}intsys_setcontext(tcp)struct tcb *tcp;{ ucontext_t uc; if (entering(tcp)) { if (!tcp->u_arg[0]) tprintf("NULL"); else if (umove(tcp, tcp->u_arg[0], &uc) < 0) tprintf("{...}"); else printcontext(tcp, &uc); } else { tcp->u_rval = tcp->u_error = 0; if (tcp->u_arg[0] == 0) return 0; return RVAL_NONE; } return 0;}#endif /* SVR4 */#if defined(LINUX) || defined(FREEBSD)static intprint_stack_t(tcp, addr)struct tcb *tcp;unsigned long addr;{ stack_t ss; if (umove(tcp, addr, &ss) < 0) return -1; tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp); if (!printflags(sigaltstack_flags, ss.ss_flags)) tprintf("0"); tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size); return 0;}intsys_sigaltstack(tcp) struct tcb *tcp;{ if (entering(tcp)) { if (tcp->u_arg[0] == 0) tprintf("NULL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -