int compat_13_sys_sigaltstack(struct lwp *l, const struct compat_13_sys_sigaltstack_args *uap, register_t *retval) { /* { syscallarg(const struct sigaltstack13 *) nss; syscallarg(struct sigaltstack13 *) oss; } */ compat_sigaltstack(uap, sigaltstack13, SS_ONSTACK, SS_DISABLE); }
int netbsd32___sigaltstack14(struct lwp *l, const struct netbsd32___sigaltstack14_args *uap, register_t *retval) { /* { syscallarg(const netbsd32_sigaltstackp_t) nss; syscallarg(netbsd32_sigaltstackp_t) oss; } */ compat_sigaltstack(uap, netbsd32_sigaltstack, SS_ONSTACK, SS_DISABLE); }
int ckpt_restore_signals(ckpt_desc_t desc) { int i; int ret; stack_t sigstack; sigset_t sigblocked; log_restore_signals("restoring sigstack ..."); if (ckpt_read(desc, &sigstack, sizeof(stack_t)) != sizeof(stack_t)) { log_err("failed to get sigstack"); return -EIO; } ret = compat_sigaltstack(current, &sigstack, NULL, 0); if (ret) { log_err("failed to restore sigstack (ret=%d)", ret); return ret; } log_restore_signals("restoring sigblocked ..."); if (ckpt_read(desc, &sigblocked, sizeof(sigset_t)) != sizeof(sigset_t)) { log_err("failed to restore sigstack"); return -EIO; } sigdelsetmask(&sigblocked, sigmask(SIGKILL) | sigmask(SIGSTOP)); spin_lock_irq(¤t->sighand->siglock); current->blocked = sigblocked; recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); log_restore_signals("restoring pending ..."); ret = ckpt_restore_sigpending(¤t->pending, 0, desc); if (ret) { log_err("failed to restore pending"); return ret; } ret = ckpt_restore_sigpending(¤t->signal->shared_pending, 1, desc); if (ret) { log_err("failed to restore shared_pending"); return ret; } log_restore_signals("restoring sigaction ..."); for (i = 0; i < _NSIG; i++) { struct k_sigaction sigaction; if (ckpt_read(desc, &sigaction, sizeof(struct k_sigaction)) != sizeof(struct k_sigaction)) { log_err("failed to get sigaction"); return -EIO; } if ((i != SIGKILL - 1) && (i != SIGSTOP - 1)) { ret = do_sigaction(i + 1, &sigaction, 0); if (ret) { log_err("failed to restore sigaction (ret=%d)", ret); return ret; } } } log_restore_pos(desc); return 0; }
int compat_13_netbsd32_sigaltstack13(struct lwp *l, const struct compat_13_netbsd32_sigaltstack13_args *uap, register_t *retval) { compat_sigaltstack(uap, netbsd32_sigaltstack13, SS_ONSTACK, SS_DISABLE); }