summaryrefslogtreecommitdiffstats
path: root/src/internal/testenv/testenv_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/testenv/testenv_unix.go')
-rw-r--r--src/internal/testenv/testenv_unix.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/internal/testenv/testenv_unix.go b/src/internal/testenv/testenv_unix.go
new file mode 100644
index 0000000..a629078
--- /dev/null
+++ b/src/internal/testenv/testenv_unix.go
@@ -0,0 +1,43 @@
+// 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
+}