| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build unix | |
| package testenv | |
| import ( | |
| "errors" | |
| "io/fs" | |
| "syscall" | |
| ) | |
| // Sigquit is the signal to send to kill a hanging subprocess. | |
| // Send SIGQUIT to get a stack trace. | |
| var Sigquit = syscall.SIGQUIT | |
| func syscallIsNotSupported(err error) bool { | |
| if err == nil { | |
| return false | |
| } | |
| var errno syscall.Errno | |
| if errors.As(err, &errno) { | |
| switch errno { | |
| case syscall.EPERM, syscall.EROFS: | |
| // User lacks permission: either the call requires root permission and the | |
| // user is not root, or the call is denied by a container security policy. | |
| return true | |
| case syscall.EINVAL: | |
| // Some containers return EINVAL instead of EPERM if a system call is | |
| // denied by security policy. | |
| return true | |
| } | |
| } | |
| if errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported) { | |
| return true | |
| } | |
| return false | |
| } |