diff options
author | davidxu <davidxu@FreeBSD.org> | 2004-06-07 13:35:02 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2004-06-07 13:35:02 +0000 |
commit | 90554db9063c14160422a025c530ef49f206e7c2 (patch) | |
tree | 56eb99ef1aab3040c2a84f434732d801a331bf6d /sys/kern | |
parent | 3b62f6e040378d864cde9a9e39d22393b6f611ea (diff) | |
download | FreeBSD-src-90554db9063c14160422a025c530ef49f206e7c2.zip FreeBSD-src-90554db9063c14160422a025c530ef49f206e7c2.tar.gz |
According to SUSv3, sigwait is different with sigwaitinfo, sigwait
returns error code in return value, not in errno.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_sig.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index adda9bd..81f5bbb 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -746,12 +746,18 @@ sigwait(struct thread *td, struct sigwait_args *uap) int error; error = copyin(uap->set, &set, sizeof(set)); - if (error) - return (error); + if (error) { + td->td_retval[0] = error; + return (0); + } error = kern_sigtimedwait(td, set, &info, NULL); - if (error) - return (error); + if (error) { + if (error == ERESTART) + return (error); + td->td_retval[0] = error; + return (0); + } error = copyout(&info.si_signo, uap->sig, sizeof(info.si_signo)); /* Repost if we got an error. */ @@ -760,7 +766,8 @@ sigwait(struct thread *td, struct sigwait_args *uap) tdsignal(td, info.si_signo, SIGTARGET_TD); PROC_UNLOCK(td->td_proc); } - return (error); + td->td_retval[0] = error; + return (0); } /* * MPSAFE |