svn commit: r283435 - head/sys/compat/linux
Dmitry Chagin
dchagin at FreeBSD.org
Sun May 24 16:28:59 UTC 2015
Author: dchagin
Date: Sun May 24 16:28:58 2015
New Revision: 283435
URL: https://svnweb.freebsd.org/changeset/base/283435
Log:
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
Modified:
head/sys/compat/linux/linux_misc.c
Modified: head/sys/compat/linux/linux_misc.c
==============================================================================
--- head/sys/compat/linux/linux_misc.c Sun May 24 16:27:38 2015 (r283434)
+++ head/sys/compat/linux/linux_misc.c Sun May 24 16:28:58 2015 (r283435)
@@ -886,26 +886,20 @@ linux_common_wait(struct thread *td, int
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 li
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;
More information about the svn-src-head
mailing list