mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Move wait constants to abi/linux package
Updates #214 PiperOrigin-RevId: 249483756 Change-Id: I0d3cf4112bed75a863d5eb08c2063fbc506cd875
This commit is contained in:
@@ -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"],
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user