mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-12-21 09:42:11 +00:00
315 lines
6.8 KiB
Go
315 lines
6.8 KiB
Go
|
package wasip1
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/tetratelabs/wazero/experimental/sys"
|
||
|
)
|
||
|
|
||
|
// Errno is neither uint16 nor an alias for parity with wasm.ValueType.
|
||
|
type Errno = uint32
|
||
|
|
||
|
// ErrnoName returns the POSIX error code name, except ErrnoSuccess, which is
|
||
|
// not an error. e.g. Errno2big -> "E2BIG"
|
||
|
func ErrnoName(errno uint32) string {
|
||
|
if int(errno) < len(errnoToString) {
|
||
|
return errnoToString[errno]
|
||
|
}
|
||
|
return fmt.Sprintf("errno(%d)", errno)
|
||
|
}
|
||
|
|
||
|
// Note: Below prefers POSIX symbol names over WASI ones, even if the docs are from WASI.
|
||
|
// See https://linux.die.net/man/3/errno
|
||
|
// See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#variants-1
|
||
|
const (
|
||
|
// ErrnoSuccess No error occurred. System call completed successfully.
|
||
|
ErrnoSuccess Errno = iota
|
||
|
// Errno2big Argument list too long.
|
||
|
Errno2big
|
||
|
// ErrnoAcces Permission denied.
|
||
|
ErrnoAcces
|
||
|
// ErrnoAddrinuse Address in use.
|
||
|
ErrnoAddrinuse
|
||
|
// ErrnoAddrnotavail Address not available.
|
||
|
ErrnoAddrnotavail
|
||
|
// ErrnoAfnosupport Address family not supported.
|
||
|
ErrnoAfnosupport
|
||
|
// ErrnoAgain Resource unavailable, or operation would block.
|
||
|
ErrnoAgain
|
||
|
// ErrnoAlready Connection already in progress.
|
||
|
ErrnoAlready
|
||
|
// ErrnoBadf Bad file descriptor.
|
||
|
ErrnoBadf
|
||
|
// ErrnoBadmsg Bad message.
|
||
|
ErrnoBadmsg
|
||
|
// ErrnoBusy Device or resource busy.
|
||
|
ErrnoBusy
|
||
|
// ErrnoCanceled Operation canceled.
|
||
|
ErrnoCanceled
|
||
|
// ErrnoChild No child processes.
|
||
|
ErrnoChild
|
||
|
// ErrnoConnaborted Connection aborted.
|
||
|
ErrnoConnaborted
|
||
|
// ErrnoConnrefused Connection refused.
|
||
|
ErrnoConnrefused
|
||
|
// ErrnoConnreset Connection reset.
|
||
|
ErrnoConnreset
|
||
|
// ErrnoDeadlk Resource deadlock would occur.
|
||
|
ErrnoDeadlk
|
||
|
// ErrnoDestaddrreq Destination address required.
|
||
|
ErrnoDestaddrreq
|
||
|
// ErrnoDom Mathematics argument out of domain of function.
|
||
|
ErrnoDom
|
||
|
// ErrnoDquot Reserved.
|
||
|
ErrnoDquot
|
||
|
// ErrnoExist File exists.
|
||
|
ErrnoExist
|
||
|
// ErrnoFault Bad address.
|
||
|
ErrnoFault
|
||
|
// ErrnoFbig File too large.
|
||
|
ErrnoFbig
|
||
|
// ErrnoHostunreach Host is unreachable.
|
||
|
ErrnoHostunreach
|
||
|
// ErrnoIdrm Identifier removed.
|
||
|
ErrnoIdrm
|
||
|
// ErrnoIlseq Illegal byte sequence.
|
||
|
ErrnoIlseq
|
||
|
// ErrnoInprogress Operation in progress.
|
||
|
ErrnoInprogress
|
||
|
// ErrnoIntr Interrupted function.
|
||
|
ErrnoIntr
|
||
|
// ErrnoInval Invalid argument.
|
||
|
ErrnoInval
|
||
|
// ErrnoIo I/O error.
|
||
|
ErrnoIo
|
||
|
// ErrnoIsconn Socket is connected.
|
||
|
ErrnoIsconn
|
||
|
// ErrnoIsdir Is a directory.
|
||
|
ErrnoIsdir
|
||
|
// ErrnoLoop Too many levels of symbolic links.
|
||
|
ErrnoLoop
|
||
|
// ErrnoMfile File descriptor value too large.
|
||
|
ErrnoMfile
|
||
|
// ErrnoMlink Too many links.
|
||
|
ErrnoMlink
|
||
|
// ErrnoMsgsize Message too large.
|
||
|
ErrnoMsgsize
|
||
|
// ErrnoMultihop Reserved.
|
||
|
ErrnoMultihop
|
||
|
// ErrnoNametoolong Filename too long.
|
||
|
ErrnoNametoolong
|
||
|
// ErrnoNetdown Network is down.
|
||
|
ErrnoNetdown
|
||
|
// ErrnoNetreset Connection aborted by network.
|
||
|
ErrnoNetreset
|
||
|
// ErrnoNetunreach Network unreachable.
|
||
|
ErrnoNetunreach
|
||
|
// ErrnoNfile Too many files open in system.
|
||
|
ErrnoNfile
|
||
|
// ErrnoNobufs No buffer space available.
|
||
|
ErrnoNobufs
|
||
|
// ErrnoNodev No such device.
|
||
|
ErrnoNodev
|
||
|
// ErrnoNoent No such file or directory.
|
||
|
ErrnoNoent
|
||
|
// ErrnoNoexec Executable file format error.
|
||
|
ErrnoNoexec
|
||
|
// ErrnoNolck No locks available.
|
||
|
ErrnoNolck
|
||
|
// ErrnoNolink Reserved.
|
||
|
ErrnoNolink
|
||
|
// ErrnoNomem Not enough space.
|
||
|
ErrnoNomem
|
||
|
// ErrnoNomsg No message of the desired type.
|
||
|
ErrnoNomsg
|
||
|
// ErrnoNoprotoopt No message of the desired type.
|
||
|
ErrnoNoprotoopt
|
||
|
// ErrnoNospc No space left on device.
|
||
|
ErrnoNospc
|
||
|
// ErrnoNosys function not supported.
|
||
|
ErrnoNosys
|
||
|
// ErrnoNotconn The socket is not connected.
|
||
|
ErrnoNotconn
|
||
|
// ErrnoNotdir Not a directory or a symbolic link to a directory.
|
||
|
ErrnoNotdir
|
||
|
// ErrnoNotempty Directory not empty.
|
||
|
ErrnoNotempty
|
||
|
// ErrnoNotrecoverable State not recoverable.
|
||
|
ErrnoNotrecoverable
|
||
|
// ErrnoNotsock Not a socket.
|
||
|
ErrnoNotsock
|
||
|
// ErrnoNotsup Not supported, or operation not supported on socket.
|
||
|
ErrnoNotsup
|
||
|
// ErrnoNotty Inappropriate I/O control operation.
|
||
|
ErrnoNotty
|
||
|
// ErrnoNxio No such device or address.
|
||
|
ErrnoNxio
|
||
|
// ErrnoOverflow Value too large to be stored in data type.
|
||
|
ErrnoOverflow
|
||
|
// ErrnoOwnerdead Previous owner died.
|
||
|
ErrnoOwnerdead
|
||
|
// ErrnoPerm Operation not permitted.
|
||
|
ErrnoPerm
|
||
|
// ErrnoPipe Broken pipe.
|
||
|
ErrnoPipe
|
||
|
// ErrnoProto Protocol error.
|
||
|
ErrnoProto
|
||
|
// ErrnoProtonosupport Protocol error.
|
||
|
ErrnoProtonosupport
|
||
|
// ErrnoPrototype Protocol wrong type for socket.
|
||
|
ErrnoPrototype
|
||
|
// ErrnoRange Result too large.
|
||
|
ErrnoRange
|
||
|
// ErrnoRofs Read-only file system.
|
||
|
ErrnoRofs
|
||
|
// ErrnoSpipe Invalid seek.
|
||
|
ErrnoSpipe
|
||
|
// ErrnoSrch No such process.
|
||
|
ErrnoSrch
|
||
|
// ErrnoStale Reserved.
|
||
|
ErrnoStale
|
||
|
// ErrnoTimedout Connection timed out.
|
||
|
ErrnoTimedout
|
||
|
// ErrnoTxtbsy Text file busy.
|
||
|
ErrnoTxtbsy
|
||
|
// ErrnoXdev Cross-device link.
|
||
|
ErrnoXdev
|
||
|
|
||
|
// Note: ErrnoNotcapable was removed by WASI maintainers.
|
||
|
// See https://github.com/WebAssembly/wasi-libc/pull/294
|
||
|
)
|
||
|
|
||
|
var errnoToString = [...]string{
|
||
|
"ESUCCESS",
|
||
|
"E2BIG",
|
||
|
"EACCES",
|
||
|
"EADDRINUSE",
|
||
|
"EADDRNOTAVAIL",
|
||
|
"EAFNOSUPPORT",
|
||
|
"EAGAIN",
|
||
|
"EALREADY",
|
||
|
"EBADF",
|
||
|
"EBADMSG",
|
||
|
"EBUSY",
|
||
|
"ECANCELED",
|
||
|
"ECHILD",
|
||
|
"ECONNABORTED",
|
||
|
"ECONNREFUSED",
|
||
|
"ECONNRESET",
|
||
|
"EDEADLK",
|
||
|
"EDESTADDRREQ",
|
||
|
"EDOM",
|
||
|
"EDQUOT",
|
||
|
"EEXIST",
|
||
|
"EFAULT",
|
||
|
"EFBIG",
|
||
|
"EHOSTUNREACH",
|
||
|
"EIDRM",
|
||
|
"EILSEQ",
|
||
|
"EINPROGRESS",
|
||
|
"EINTR",
|
||
|
"EINVAL",
|
||
|
"EIO",
|
||
|
"EISCONN",
|
||
|
"EISDIR",
|
||
|
"ELOOP",
|
||
|
"EMFILE",
|
||
|
"EMLINK",
|
||
|
"EMSGSIZE",
|
||
|
"EMULTIHOP",
|
||
|
"ENAMETOOLONG",
|
||
|
"ENETDOWN",
|
||
|
"ENETRESET",
|
||
|
"ENETUNREACH",
|
||
|
"ENFILE",
|
||
|
"ENOBUFS",
|
||
|
"ENODEV",
|
||
|
"ENOENT",
|
||
|
"ENOEXEC",
|
||
|
"ENOLCK",
|
||
|
"ENOLINK",
|
||
|
"ENOMEM",
|
||
|
"ENOMSG",
|
||
|
"ENOPROTOOPT",
|
||
|
"ENOSPC",
|
||
|
"ENOSYS",
|
||
|
"ENOTCONN",
|
||
|
"ENOTDIR",
|
||
|
"ENOTEMPTY",
|
||
|
"ENOTRECOVERABLE",
|
||
|
"ENOTSOCK",
|
||
|
"ENOTSUP",
|
||
|
"ENOTTY",
|
||
|
"ENXIO",
|
||
|
"EOVERFLOW",
|
||
|
"EOWNERDEAD",
|
||
|
"EPERM",
|
||
|
"EPIPE",
|
||
|
"EPROTO",
|
||
|
"EPROTONOSUPPORT",
|
||
|
"EPROTOTYPE",
|
||
|
"ERANGE",
|
||
|
"EROFS",
|
||
|
"ESPIPE",
|
||
|
"ESRCH",
|
||
|
"ESTALE",
|
||
|
"ETIMEDOUT",
|
||
|
"ETXTBSY",
|
||
|
"EXDEV",
|
||
|
"ENOTCAPABLE",
|
||
|
}
|
||
|
|
||
|
// ToErrno coerces the error to a WASI Errno.
|
||
|
//
|
||
|
// Note: Coercion isn't centralized in sys.FSContext because ABI use different
|
||
|
// error codes. For example, wasi-filesystem doesn't map to these
|
||
|
// Errno.
|
||
|
func ToErrno(errno sys.Errno) Errno {
|
||
|
switch errno {
|
||
|
case 0:
|
||
|
return ErrnoSuccess
|
||
|
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.ERANGE:
|
||
|
return ErrnoRange
|
||
|
case sys.ENOTEMPTY:
|
||
|
return ErrnoNotempty
|
||
|
case sys.ENOTSOCK:
|
||
|
return ErrnoNotsock
|
||
|
case sys.ENOTSUP:
|
||
|
return ErrnoNotsup
|
||
|
case sys.EPERM:
|
||
|
return ErrnoPerm
|
||
|
case sys.EROFS:
|
||
|
return ErrnoRofs
|
||
|
default:
|
||
|
return ErrnoIo
|
||
|
}
|
||
|
}
|