Convert Linux wait options to the FreeBSD.

Check wait options as a Linux do.
Linux always set WEXITED option not a WUNTRACED|WNOHANG
which is a strange bug.

Differential Revision:	https://reviews.freebsd.org/D1085
Reviewed by:	trasz
This commit is contained in:
Dmitry Chagin 2015-05-24 16:28:58 +00:00
parent 7a7a6efc25
commit 2245df381a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283435

View File

@ -886,26 +886,20 @@ linux_common_wait(struct thread *td, int pid, int *status,
int
linux_waitpid(struct thread *td, struct linux_waitpid_args *args)
{
int options;
struct linux_wait4_args wait4_args;
#ifdef DEBUG
if (ldebug(waitpid))
printf(ARGS(waitpid, "%d, %p, %d"),
args->pid, (void *)args->status, args->options);
#endif
/*
* this is necessary because the test in kern_wait doesn't work
* because we mess with the options here
*/
if (args->options & ~(WUNTRACED | WNOHANG | WCONTINUED | __WCLONE))
return (EINVAL);
options = (args->options & (WNOHANG | WUNTRACED));
/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
if (args->options & __WCLONE)
options |= WLINUXCLONE;
return (linux_common_wait(td, args->pid, args->status, options, NULL));
wait4_args.pid = args->pid;
wait4_args.status = args->status;
wait4_args.options = args->options;
wait4_args.rusage = NULL;
return (linux_wait4(td, &wait4_args));
}
#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
@ -921,11 +915,12 @@ linux_wait4(struct thread *td, struct linux_wait4_args *args)
args->pid, (void *)args->status, args->options,
(void *)args->rusage);
#endif
if (args->options & ~(LINUX_WUNTRACED | LINUX_WNOHANG |
LINUX_WCONTINUED | __WCLONE | __WNOTHREAD | __WALL))
return (EINVAL);
options = (args->options & (WNOHANG | WUNTRACED));
/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
if (args->options & __WCLONE)
options |= WLINUXCLONE;
options = WEXITED;
linux_to_bsd_waitopts(args->options, &options);
if (args->rusage != NULL)
rup = &ru;