summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/abi/linux/BUILD1
-rw-r--r--pkg/abi/linux/wait.go36
-rw-r--r--pkg/sentry/syscalls/linux/sys_thread.go42
3 files changed, 54 insertions, 25 deletions
diff --git a/pkg/abi/linux/BUILD b/pkg/abi/linux/BUILD
index 96e8d4641..fbd0e4674 100644
--- a/pkg/abi/linux/BUILD
+++ b/pkg/abi/linux/BUILD
@@ -52,6 +52,7 @@ go_library(
"tty.go",
"uio.go",
"utsname.go",
+ "wait.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/abi/linux",
visibility = ["//visibility:public"],
diff --git a/pkg/abi/linux/wait.go b/pkg/abi/linux/wait.go
new file mode 100644
index 000000000..4bdc280d1
--- /dev/null
+++ b/pkg/abi/linux/wait.go
@@ -0,0 +1,36 @@
+// Copyright 2019 The gVisor Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package linux
+
+// Options for waitpid(2), wait4(2), and/or waitid(2), from
+// include/uapi/linux/wait.h.
+const (
+ WNOHANG = 0x00000001
+ WUNTRACED = 0x00000002
+ WSTOPPED = WUNTRACED
+ WEXITED = 0x00000004
+ WCONTINUED = 0x00000008
+ WNOWAIT = 0x01000000
+ WNOTHREAD = 0x20000000
+ WALL = 0x40000000
+ WCLONE = 0x80000000
+)
+
+// ID types for waitid(2), from include/uapi/linux/wait.h.
+const (
+ P_ALL = 0x0
+ P_PID = 0x1
+ P_PGID = 0x2
+)
diff --git a/pkg/sentry/syscalls/linux/sys_thread.go b/pkg/sentry/syscalls/linux/sys_thread.go
index 23c2f7035..cc441460c 100644
--- a/pkg/sentry/syscalls/linux/sys_thread.go
+++ b/pkg/sentry/syscalls/linux/sys_thread.go
@@ -42,14 +42,6 @@ const (
exitSignalMask = 0xff
)
-// Possible values for the idtype argument to waitid(2), defined in Linux's
-// include/uapi/linux/wait.h.
-const (
- _P_ALL = 0
- _P_PID = 1
- _P_PGID = 2
-)
-
// Getppid implements linux syscall getppid(2).
func Getppid(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
parent := t.Parent()
@@ -191,7 +183,7 @@ func Vfork(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
// wait4 waits for the given child process to exit.
func wait4(t *kernel.Task, pid int, statusAddr usermem.Addr, options int, rusageAddr usermem.Addr) (uintptr, error) {
- if options&^(syscall.WNOHANG|syscall.WUNTRACED|syscall.WCONTINUED|syscall.WALL|syscall.WCLONE) != 0 {
+ if options&^(linux.WNOHANG|linux.WUNTRACED|linux.WCONTINUED|linux.WALL|linux.WCLONE) != 0 {
return 0, syscall.EINVAL
}
wopts := kernel.WaitOptions{
@@ -215,24 +207,24 @@ func wait4(t *kernel.Task, pid int, statusAddr usermem.Addr, options int, rusage
wopts.SpecificTID = kernel.ThreadID(pid)
}
- switch options & (syscall.WCLONE | syscall.WALL) {
+ switch options & (linux.WCLONE | linux.WALL) {
case 0:
wopts.NonCloneTasks = true
- case syscall.WCLONE:
+ case linux.WCLONE:
wopts.CloneTasks = true
- case syscall.WALL:
+ case linux.WALL:
wopts.NonCloneTasks = true
wopts.CloneTasks = true
default:
return 0, syscall.EINVAL
}
- if options&syscall.WUNTRACED != 0 {
+ if options&linux.WUNTRACED != 0 {
wopts.Events |= kernel.EventChildGroupStop
}
- if options&syscall.WCONTINUED != 0 {
+ if options&linux.WCONTINUED != 0 {
wopts.Events |= kernel.EventGroupContinue
}
- if options&syscall.WNOHANG == 0 {
+ if options&linux.WNOHANG == 0 {
wopts.BlockInterruptErr = kernel.ERESTARTSYS
}
@@ -286,36 +278,36 @@ func Waitid(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
options := int(args[3].Uint())
rusageAddr := args[4].Pointer()
- if options&^(syscall.WNOHANG|syscall.WEXITED|syscall.WSTOPPED|syscall.WCONTINUED|syscall.WNOWAIT) != 0 {
+ if options&^(linux.WNOHANG|linux.WEXITED|linux.WSTOPPED|linux.WCONTINUED|linux.WNOWAIT) != 0 {
return 0, nil, syscall.EINVAL
}
- if options&(syscall.WEXITED|syscall.WSTOPPED|syscall.WCONTINUED) == 0 {
+ if options&(linux.WEXITED|linux.WSTOPPED|linux.WCONTINUED) == 0 {
return 0, nil, syscall.EINVAL
}
wopts := kernel.WaitOptions{
NonCloneTasks: true,
Events: kernel.EventTraceeStop,
- ConsumeEvent: options&syscall.WNOWAIT == 0,
+ ConsumeEvent: options&linux.WNOWAIT == 0,
}
switch idtype {
- case _P_ALL:
- case _P_PID:
+ case linux.P_ALL:
+ case linux.P_PID:
wopts.SpecificTID = kernel.ThreadID(id)
- case _P_PGID:
+ case linux.P_PGID:
wopts.SpecificPGID = kernel.ProcessGroupID(id)
default:
return 0, nil, syscall.EINVAL
}
- if options&syscall.WEXITED != 0 {
+ if options&linux.WEXITED != 0 {
wopts.Events |= kernel.EventExit
}
- if options&syscall.WSTOPPED != 0 {
+ if options&linux.WSTOPPED != 0 {
wopts.Events |= kernel.EventChildGroupStop
}
- if options&syscall.WCONTINUED != 0 {
+ if options&linux.WCONTINUED != 0 {
wopts.Events |= kernel.EventGroupContinue
}
- if options&syscall.WNOHANG == 0 {
+ if options&linux.WNOHANG == 0 {
wopts.BlockInterruptErr = kernel.ERESTARTSYS
}