summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/experimental/sys/error.go
blob: a0c76019aaff9e98fed4463a4b3893a4bfabbbb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package sys

import (
	"io"
	"io/fs"
	"os"
)

// UnwrapOSError returns an Errno or zero if the input is nil.
func UnwrapOSError(err error) Errno {
	if err == nil {
		return 0
	}
	err = underlyingError(err)
	switch err {
	case nil, io.EOF:
		return 0 // EOF is not a Errno
	case fs.ErrInvalid:
		return EINVAL
	case fs.ErrPermission:
		return EPERM
	case fs.ErrExist:
		return EEXIST
	case fs.ErrNotExist:
		return ENOENT
	case fs.ErrClosed:
		return EBADF
	}
	return errorToErrno(err)
}

// underlyingError returns the underlying error if a well-known OS error type.
//
// This impl is basically the same as os.underlyingError in os/error.go
func underlyingError(err error) error {
	switch err := err.(type) {
	case *os.PathError:
		return err.Err
	case *os.LinkError:
		return err.Err
	case *os.SyscallError:
		return err.Err
	}
	return err
}