version 1.24, 1999/10/04 17:46:37 |
version 1.24.2.2, 2001/02/11 19:14:04 |
|
|
|= (1 << ((n) - 1) % LINUX__NSIG_BPW)) |
|= (1 << ((n) - 1) % LINUX__NSIG_BPW)) |
|
|
/* Note: linux_to_native_sig[] is in <arch>/linux_sigarray.c */ |
/* Note: linux_to_native_sig[] is in <arch>/linux_sigarray.c */ |
int native_to_linux_sig[NSIG] = { |
const int native_to_linux_sig[NSIG] = { |
0, |
0, |
LINUX_SIGHUP, |
LINUX_SIGHUP, |
LINUX_SIGINT, |
LINUX_SIGINT, |
Line 318 native_to_linux_sigaction(bsa, lsa) |
|
Line 318 native_to_linux_sigaction(bsa, lsa) |
|
*/ |
*/ |
int |
int |
linux_sys_rt_sigaction(p, v, retval) |
linux_sys_rt_sigaction(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 330 linux_sys_rt_sigaction(p, v, retval) |
|
Line 330 linux_sys_rt_sigaction(p, v, retval) |
|
} */ *uap = v; |
} */ *uap = v; |
struct linux_sigaction nlsa, olsa; |
struct linux_sigaction nlsa, olsa; |
struct sigaction nbsa, obsa; |
struct sigaction nbsa, obsa; |
int error; |
int error, sig; |
|
|
if (SCARG(uap, sigsetsize) != sizeof(linux_sigset_t)) |
if (SCARG(uap, sigsetsize) != sizeof(linux_sigset_t)) |
return (EINVAL); |
return (EINVAL); |
Line 341 linux_sys_rt_sigaction(p, v, retval) |
|
Line 341 linux_sys_rt_sigaction(p, v, retval) |
|
return (error); |
return (error); |
linux_to_native_sigaction(&nlsa, &nbsa); |
linux_to_native_sigaction(&nlsa, &nbsa); |
} |
} |
error = sigaction1(p, linux_to_native_sig[SCARG(uap, signum)], |
sig = SCARG(uap, signum); |
SCARG(uap, nsa) ? &nbsa : 0, SCARG(uap, osa) ? &obsa : 0); |
if (sig < 0 || sig >= LINUX__NSIG) |
if (error) |
return (EINVAL); |
return (error); |
if (sig > 0 && !linux_to_native_sig[sig]) { |
|
/* Pretend that we did something useful for unknown signals. */ |
|
obsa.sa_handler = SIG_IGN; |
|
sigemptyset(&obsa.sa_mask); |
|
obsa.sa_flags = 0; |
|
} else { |
|
error = sigaction1(p, linux_to_native_sig[sig], |
|
SCARG(uap, nsa) ? &nbsa : NULL, SCARG(uap, osa) ? &obsa : NULL); |
|
if (error) |
|
return (error); |
|
} |
if (SCARG(uap, osa)) { |
if (SCARG(uap, osa)) { |
native_to_linux_sigaction(&obsa, &olsa); |
native_to_linux_sigaction(&obsa, &olsa); |
error = copyout(&olsa, SCARG(uap, osa), sizeof(olsa)); |
error = copyout(&olsa, SCARG(uap, osa), sizeof(olsa)); |
Line 356 linux_sys_rt_sigaction(p, v, retval) |
|
Line 366 linux_sys_rt_sigaction(p, v, retval) |
|
|
|
int |
int |
linux_sigprocmask1(p, how, set, oset) |
linux_sigprocmask1(p, how, set, oset) |
register struct proc *p; |
struct proc *p; |
int how; |
int how; |
const linux_old_sigset_t *set; |
const linux_old_sigset_t *set; |
linux_old_sigset_t *oset; |
linux_old_sigset_t *oset; |
Line 386 linux_sigprocmask1(p, how, set, oset) |
|
Line 396 linux_sigprocmask1(p, how, set, oset) |
|
linux_old_to_native_sigset(&nlss, &nbss); |
linux_old_to_native_sigset(&nlss, &nbss); |
} |
} |
error = sigprocmask1(p, how, |
error = sigprocmask1(p, how, |
set ? &nbss : 0, oset ? &obss : 0); |
set ? &nbss : NULL, oset ? &obss : NULL); |
if (error) |
if (error) |
return (error); |
return (error); |
if (oset) { |
if (oset) { |
Line 400 linux_sigprocmask1(p, how, set, oset) |
|
Line 410 linux_sigprocmask1(p, how, set, oset) |
|
|
|
int |
int |
linux_sys_rt_sigprocmask(p, v, retval) |
linux_sys_rt_sigprocmask(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 443 linux_sys_rt_sigprocmask(p, v, retval) |
|
Line 453 linux_sys_rt_sigprocmask(p, v, retval) |
|
linux_to_native_sigset(&nlss, &nbss); |
linux_to_native_sigset(&nlss, &nbss); |
} |
} |
error = sigprocmask1(p, how, |
error = sigprocmask1(p, how, |
set ? &nbss : 0, oset ? &obss : 0); |
set ? &nbss : NULL, oset ? &obss : NULL); |
if (error) |
if (!error && oset) { |
return (error); |
|
if (oset) { |
|
native_to_linux_sigset(&obss, &olss); |
native_to_linux_sigset(&obss, &olss); |
error = copyout(&olss, oset, sizeof(olss)); |
error = copyout(&olss, oset, sizeof(olss)); |
if (error) |
|
return (error); |
|
} |
} |
return (error); |
return (error); |
} |
} |
|
|
int |
int |
linux_sys_rt_sigpending(p, v, retval) |
linux_sys_rt_sigpending(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 478 linux_sys_rt_sigpending(p, v, retval) |
|
Line 484 linux_sys_rt_sigpending(p, v, retval) |
|
|
|
int |
int |
linux_sys_sigpending(p, v, retval) |
linux_sys_sigpending(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 495 linux_sys_sigpending(p, v, retval) |
|
Line 501 linux_sys_sigpending(p, v, retval) |
|
|
|
int |
int |
linux_sys_sigsuspend(p, v, retval) |
linux_sys_sigsuspend(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 513 linux_sys_sigsuspend(p, v, retval) |
|
Line 519 linux_sys_sigsuspend(p, v, retval) |
|
} |
} |
int |
int |
linux_sys_rt_sigsuspend(p, v, retval) |
linux_sys_rt_sigsuspend(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 543 linux_sys_rt_sigsuspend(p, v, retval) |
|
Line 549 linux_sys_rt_sigsuspend(p, v, retval) |
|
*/ |
*/ |
int |
int |
linux_sys_rt_queueinfo(p, v, retval) |
linux_sys_rt_queueinfo(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 563 linux_sys_rt_queueinfo(p, v, retval) |
|
Line 569 linux_sys_rt_queueinfo(p, v, retval) |
|
|
|
int |
int |
linux_sys_kill(p, v, retval) |
linux_sys_kill(p, v, retval) |
register struct proc *p; |
struct proc *p; |
void *v; |
void *v; |
register_t *retval; |
register_t *retval; |
{ |
{ |
Line 572 linux_sys_kill(p, v, retval) |
|
Line 578 linux_sys_kill(p, v, retval) |
|
syscallarg(int) signum; |
syscallarg(int) signum; |
} */ *uap = v; |
} */ *uap = v; |
struct sys_kill_args ka; |
struct sys_kill_args ka; |
|
int sig; |
|
|
SCARG(&ka, pid) = SCARG(uap, pid); |
SCARG(&ka, pid) = SCARG(uap, pid); |
SCARG(&ka, signum) = linux_to_native_sig[SCARG(uap, signum)]; |
sig = SCARG(uap, signum); |
|
if (sig < 0 || sig >= LINUX__NSIG) |
|
return (EINVAL); |
|
SCARG(&ka, signum) = linux_to_native_sig[sig]; |
return sys_kill(p, &ka, retval); |
return sys_kill(p, &ka, retval); |
} |
} |
|
|
|
#ifdef LINUX_SS_ONSTACK |
|
static void linux_to_native_sigaltstack __P((struct sigaltstack *, |
|
const struct linux_sigaltstack *)); |
|
static void native_to_linux_sigaltstack __P((struct linux_sigaltstack *, |
|
const struct sigaltstack *)); |
|
|
|
static void |
|
linux_to_native_sigaltstack(bss, lss) |
|
struct sigaltstack *bss; |
|
const struct linux_sigaltstack *lss; |
|
{ |
|
bss->ss_sp = lss->ss_sp; |
|
bss->ss_size = lss->ss_size; |
|
if (lss->ss_flags & LINUX_SS_ONSTACK) |
|
bss->ss_flags = SS_ONSTACK; |
|
else if (lss->ss_flags & LINUX_SS_DISABLE) |
|
bss->ss_flags = SS_DISABLE; |
|
else |
|
bss->ss_flags = 0; |
|
} |
|
|
|
static void |
|
native_to_linux_sigaltstack(lss, bss) |
|
struct linux_sigaltstack *lss; |
|
const struct sigaltstack *bss; |
|
{ |
|
lss->ss_sp = bss->ss_sp; |
|
lss->ss_size = bss->ss_size; |
|
if (bss->ss_flags & SS_ONSTACK) |
|
lss->ss_flags = LINUX_SS_ONSTACK; |
|
else if (bss->ss_flags & SS_DISABLE) |
|
lss->ss_flags = LINUX_SS_DISABLE; |
|
else |
|
lss->ss_flags = 0; |
|
} |
|
|
|
int |
|
linux_sys_sigaltstack(p, v, retval) |
|
struct proc *p; |
|
void *v; |
|
register_t *retval; |
|
{ |
|
struct linux_sys_sigaltstack_args /* { |
|
syscallarg(const struct linux_sigaltstack *) ss; |
|
syscallarg(struct linux_sigaltstack *) oss; |
|
} */ *uap = v; |
|
struct linux_sigaltstack ss; |
|
struct sigaltstack nss, oss; |
|
int error; |
|
|
|
if (SCARG(uap, ss) != NULL) { |
|
if ((error = copyin(SCARG(uap, ss), &ss, sizeof(ss))) != 0) |
|
return error; |
|
linux_to_native_sigaltstack(&nss, &ss); |
|
} |
|
|
|
error = sigaltstack1(p, |
|
SCARG(uap, ss) ? &nss : NULL, SCARG(uap, oss) ? &oss : NULL); |
|
if (error) |
|
return error; |
|
|
|
if (SCARG(uap, oss) != NULL) { |
|
native_to_linux_sigaltstack(&ss, &oss); |
|
if ((error = copyout(&ss, SCARG(uap, oss), sizeof(ss))) != 0) |
|
return error; |
|
} |
|
return 0; |
|
} |
|
#endif |