diff options
Diffstat (limited to 'sys/compat/linux/linux_signal.c')
-rw-r--r-- | sys/compat/linux/linux_signal.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index ca4bda1..82dd2ee 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -431,7 +431,7 @@ int linux_rt_sigtimedwait(struct thread *td, struct linux_rt_sigtimedwait_args *args) { - int error; + int error, sig; l_timeval ltv; struct timeval tv; struct timespec ts, *tsa; @@ -457,8 +457,9 @@ linux_rt_sigtimedwait(struct thread *td, return (error); #ifdef DEBUG if (ldebug(rt_sigtimedwait)) - printf(LMSG("linux_rt_sigtimedwait: incoming timeout (%d/%d)\n"), - ltv.tv_sec, ltv.tv_usec); + printf(LMSG("linux_rt_sigtimedwait: " + "incoming timeout (%d/%d)\n"), + ltv.tv_sec, ltv.tv_usec); #endif tv.tv_sec = (long)ltv.tv_sec; tv.tv_usec = (suseconds_t)ltv.tv_usec; @@ -477,8 +478,9 @@ linux_rt_sigtimedwait(struct thread *td, timevalclear(&tv); #ifdef DEBUG if (ldebug(rt_sigtimedwait)) - printf(LMSG("linux_rt_sigtimedwait: converted timeout (%jd/%ld)\n"), - (intmax_t)tv.tv_sec, tv.tv_usec); + printf(LMSG("linux_rt_sigtimedwait: " + "converted timeout (%jd/%ld)\n"), + (intmax_t)tv.tv_sec, tv.tv_usec); #endif } TIMEVAL_TO_TIMESPEC(&tv, &ts); @@ -487,24 +489,21 @@ linux_rt_sigtimedwait(struct thread *td, error = kern_sigtimedwait(td, bset, &info, tsa); #ifdef DEBUG if (ldebug(rt_sigtimedwait)) - printf(LMSG("linux_rt_sigtimedwait: sigtimedwait returning (%d)\n"), error); + printf(LMSG("linux_rt_sigtimedwait: " + "sigtimedwait returning (%d)\n"), error); #endif if (error) return (error); + sig = BSD_TO_LINUX_SIGNAL(info.ksi_signo); + if (args->ptr) { memset(&linfo, 0, sizeof(linfo)); - linfo.lsi_signo = info.ksi_signo; + ksiginfo_to_lsiginfo(&info, &linfo, sig); error = copyout(&linfo, args->ptr, sizeof(linfo)); } - - /* Repost if we got an error. */ - if (error && info.ksi_signo) { - PROC_LOCK(td->td_proc); - tdksignal(td, info.ksi_signo, &info); - PROC_UNLOCK(td->td_proc); - } else - td->td_retval[0] = info.ksi_signo; + if (error == 0) + td->td_retval[0] = sig; return (error); } @@ -526,7 +525,7 @@ linux_kill(struct thread *td, struct linux_kill_args *args) * Allow signal 0 as a means to check for privileges */ if (!LINUX_SIG_VALID(args->signum) && args->signum != 0) - return EINVAL; + return (EINVAL); if (args->signum > 0 && args->signum <= LINUX_SIGTBLSZ) tmp.signum = linux_to_bsd_signal[_SIG_IDX(args->signum)]; @@ -650,4 +649,8 @@ ksiginfo_to_lsiginfo(ksiginfo_t *ksi, l_siginfo_t *lsi, l_int sig) lsi->lsi_uid = ksi->ksi_uid; break; } + if (sig >= LINUX_SIGRTMIN) { + lsi->lsi_int = ksi->ksi_info.si_value.sival_int; + lsi->lsi_ptr = PTROUT(ksi->ksi_info.si_value.sival_ptr); + } } |