| // 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 |
| } |