diff options
-rw-r--r-- | pkg/abi/linux/BUILD | 1 | ||||
-rw-r--r-- | pkg/abi/linux/wait.go | 36 | ||||
-rw-r--r-- | pkg/sentry/syscalls/linux/sys_thread.go | 42 |
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 } |