diff --git a/pkg/p9/handlers.go b/pkg/p9/handlers.go index c0f5f8b3f..8a999cb02 100644 --- a/pkg/p9/handlers.go +++ b/pkg/p9/handlers.go @@ -30,36 +30,43 @@ import ( "gvisor.dev/gvisor/pkg/log" ) -// ExtractErrno extracts a unix.Errno from a error, best effort. +// ExtractErrno extracts a unix.Errno from an error, best effort. func ExtractErrno(err error) unix.Errno { + errno, _ := TryExtractErrno(err) + return errno +} + +// TryExtractErrno extracts a unix.Errno from an error, and reports whether it +// was successful. If unsuccessful, the returned errno is EIO. +func TryExtractErrno(err error) (unix.Errno, bool) { switch err { case os.ErrNotExist: - return unix.ENOENT + return unix.ENOENT, true case os.ErrExist: - return unix.EEXIST + return unix.EEXIST, true case os.ErrPermission: - return unix.EACCES + return unix.EACCES, true case os.ErrInvalid: - return unix.EINVAL + return unix.EINVAL, true } // Attempt to unwrap. switch e := err.(type) { case *errors.Error: - return linuxerr.ToUnix(e) + return linuxerr.ToUnix(e), true case unix.Errno: - return e + return e, true case *os.PathError: - return ExtractErrno(e.Err) + return TryExtractErrno(e.Err) case *os.SyscallError: - return ExtractErrno(e.Err) + return TryExtractErrno(e.Err) case *os.LinkError: - return ExtractErrno(e.Err) + return TryExtractErrno(e.Err) } // Default case. log.Warningf("unknown error: %v", err) - return unix.EIO + return unix.EIO, false } // newErr returns a new error message from an error.