2022-03-16 07:48:16 +00:00
|
|
|
// 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.
|
|
|
|
|
2022-11-14 18:13:09 +00:00
|
|
|
//go:build unix
|
2022-03-16 07:48:16 +00:00
|
|
|
|
|
|
|
package testenv
|
|
|
|
|
2023-08-23 16:23:52 +00:00
|
|
|
import (
|
2023-12-04 11:07:54 +00:00
|
|
|
"errors"
|
|
|
|
"io/fs"
|
2023-08-23 16:23:52 +00:00
|
|
|
"syscall"
|
|
|
|
)
|
2022-03-16 07:48:16 +00:00
|
|
|
|
|
|
|
// Sigquit is the signal to send to kill a hanging subprocess.
|
|
|
|
// Send SIGQUIT to get a stack trace.
|
|
|
|
var Sigquit = syscall.SIGQUIT
|
2023-08-23 16:23:52 +00:00
|
|
|
|
|
|
|
func syscallIsNotSupported(err error) bool {
|
2023-12-04 11:07:54 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-14 19:25:16 +00:00
|
|
|
if errors.Is(err, fs.ErrPermission) || errors.Is(err, errors.ErrUnsupported) {
|
2023-12-04 11:07:54 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2023-08-23 16:23:52 +00:00
|
|
|
return false
|
|
|
|
}
|