summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2004-06-07 13:35:02 +0000
committerdavidxu <davidxu@FreeBSD.org>2004-06-07 13:35:02 +0000
commit90554db9063c14160422a025c530ef49f206e7c2 (patch)
tree56eb99ef1aab3040c2a84f434732d801a331bf6d /sys/kern
parent3b62f6e040378d864cde9a9e39d22393b6f611ea (diff)
downloadFreeBSD-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.c17
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
OpenPOWER on IntegriCloud