113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
package gojs
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/tetratelabs/wazero/experimental/sys"
|
|
)
|
|
|
|
// Errno is a (GOARCH=wasm) error, which must match a key in mapJSError.
|
|
//
|
|
// See https://github.com/golang/go/blob/go1.20/src/syscall/tables_js.go#L371-L494
|
|
type Errno struct {
|
|
s string
|
|
}
|
|
|
|
// Error implements error.
|
|
func (e *Errno) Error() string {
|
|
return e.s
|
|
}
|
|
|
|
// This order match constants from wasi_snapshot_preview1.ErrnoSuccess for
|
|
// easier maintenance.
|
|
var (
|
|
// ErrnoAcces Permission denied.
|
|
ErrnoAcces = &Errno{"EACCES"}
|
|
// ErrnoAgain Resource unavailable, or operation would block.
|
|
ErrnoAgain = &Errno{"EAGAIN"}
|
|
// ErrnoBadf Bad file descriptor.
|
|
ErrnoBadf = &Errno{"EBADF"}
|
|
// ErrnoExist File exists.
|
|
ErrnoExist = &Errno{"EEXIST"}
|
|
// ErrnoFault Bad address.
|
|
ErrnoFault = &Errno{"EFAULT"}
|
|
// ErrnoIntr Interrupted function.
|
|
ErrnoIntr = &Errno{"EINTR"}
|
|
// ErrnoInval Invalid argument.
|
|
ErrnoInval = &Errno{"EINVAL"}
|
|
// ErrnoIo I/O error.
|
|
ErrnoIo = &Errno{"EIO"}
|
|
// ErrnoIsdir Is a directory.
|
|
ErrnoIsdir = &Errno{"EISDIR"}
|
|
// ErrnoLoop Too many levels of symbolic links.
|
|
ErrnoLoop = &Errno{"ELOOP"}
|
|
// ErrnoNametoolong Filename too long.
|
|
ErrnoNametoolong = &Errno{"ENAMETOOLONG"}
|
|
// ErrnoNoent No such file or directory.
|
|
ErrnoNoent = &Errno{"ENOENT"}
|
|
// ErrnoNosys function not supported.
|
|
ErrnoNosys = &Errno{"ENOSYS"}
|
|
// ErrnoNotdir Not a directory or a symbolic link to a directory.
|
|
ErrnoNotdir = &Errno{"ENOTDIR"}
|
|
// ErrnoNotempty Directory not empty.
|
|
ErrnoNotempty = &Errno{"ENOTEMPTY"}
|
|
// ErrnoNotsup Not supported, or operation not supported on socket.
|
|
ErrnoNotsup = &Errno{"ENOTSUP"}
|
|
// ErrnoPerm Operation not permitted.
|
|
ErrnoPerm = &Errno{"EPERM"}
|
|
// ErrnoRofs read-only file system.
|
|
ErrnoRofs = &Errno{"EROFS"}
|
|
)
|
|
|
|
// ToErrno maps I/O errors as the message must be the code, ex. "EINVAL", not
|
|
// the message, e.g. "invalid argument".
|
|
func ToErrno(err error) *Errno {
|
|
if err == nil || err == io.EOF {
|
|
return nil // io.EOF has no value in GOOS=js, and isn't an error.
|
|
}
|
|
errno, ok := err.(sys.Errno)
|
|
if !ok {
|
|
return ErrnoIo
|
|
}
|
|
switch errno {
|
|
case sys.EACCES:
|
|
return ErrnoAcces
|
|
case sys.EAGAIN:
|
|
return ErrnoAgain
|
|
case sys.EBADF:
|
|
return ErrnoBadf
|
|
case sys.EEXIST:
|
|
return ErrnoExist
|
|
case sys.EFAULT:
|
|
return ErrnoFault
|
|
case sys.EINTR:
|
|
return ErrnoIntr
|
|
case sys.EINVAL:
|
|
return ErrnoInval
|
|
case sys.EIO:
|
|
return ErrnoIo
|
|
case sys.EISDIR:
|
|
return ErrnoIsdir
|
|
case sys.ELOOP:
|
|
return ErrnoLoop
|
|
case sys.ENAMETOOLONG:
|
|
return ErrnoNametoolong
|
|
case sys.ENOENT:
|
|
return ErrnoNoent
|
|
case sys.ENOSYS:
|
|
return ErrnoNosys
|
|
case sys.ENOTDIR:
|
|
return ErrnoNotdir
|
|
case sys.ENOTEMPTY:
|
|
return ErrnoNotempty
|
|
case sys.ENOTSUP:
|
|
return ErrnoNotsup
|
|
case sys.EPERM:
|
|
return ErrnoPerm
|
|
case sys.EROFS:
|
|
return ErrnoRofs
|
|
default:
|
|
return ErrnoIo
|
|
}
|
|
}
|