diff options
Diffstat (limited to 'pkg/syserr')
-rw-r--r-- | pkg/syserr/BUILD | 20 | ||||
-rw-r--r-- | pkg/syserr/host_linux.go | 160 | ||||
-rw-r--r-- | pkg/syserr/linuxabi.go | 30 | ||||
-rw-r--r-- | pkg/syserr/netstack.go | 93 | ||||
-rw-r--r-- | pkg/syserr/syserr.go | 236 |
5 files changed, 539 insertions, 0 deletions
diff --git a/pkg/syserr/BUILD b/pkg/syserr/BUILD new file mode 100644 index 000000000..e5ce48412 --- /dev/null +++ b/pkg/syserr/BUILD @@ -0,0 +1,20 @@ +package(licenses = ["notice"]) # Apache 2.0 + +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "syserr", + srcs = [ + "host_linux.go", + "linuxabi.go", + "netstack.go", + "syserr.go", + ], + importpath = "gvisor.googlesource.com/gvisor/pkg/syserr", + visibility = ["//visibility:public"], + deps = [ + "//pkg/abi/linux", + "//pkg/syserror", + "//pkg/tcpip", + ], +) diff --git a/pkg/syserr/host_linux.go b/pkg/syserr/host_linux.go new file mode 100644 index 000000000..ffd78e8f8 --- /dev/null +++ b/pkg/syserr/host_linux.go @@ -0,0 +1,160 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux + +package syserr + +import ( + "syscall" +) + +var linuxHostTranslations = map[syscall.Errno]*Error{ + syscall.EPERM: ErrNotPermitted, + syscall.ENOENT: ErrNoFileOrDir, + syscall.ESRCH: ErrNoProcess, + syscall.EINTR: ErrInterrupted, + syscall.EIO: ErrIO, + syscall.ENXIO: ErrDeviceOrAddress, + syscall.E2BIG: ErrTooManyArgs, + syscall.ENOEXEC: ErrEcec, + syscall.EBADF: ErrBadFD, + syscall.ECHILD: ErrNoChild, + syscall.EAGAIN: ErrTryAgain, + syscall.ENOMEM: ErrNoMemory, + syscall.EACCES: ErrPermissionDenied, + syscall.EFAULT: ErrBadAddress, + syscall.ENOTBLK: ErrNotBlockDevice, + syscall.EBUSY: ErrBusy, + syscall.EEXIST: ErrExists, + syscall.EXDEV: ErrCrossDeviceLink, + syscall.ENODEV: ErrNoDevice, + syscall.ENOTDIR: ErrNotDir, + syscall.EISDIR: ErrIsDir, + syscall.EINVAL: ErrInvalidArgument, + syscall.ENFILE: ErrFileTableOverflow, + syscall.EMFILE: ErrTooManyOpenFiles, + syscall.ENOTTY: ErrNotTTY, + syscall.ETXTBSY: ErrTestFileBusy, + syscall.EFBIG: ErrFileTooBig, + syscall.ENOSPC: ErrNoSpace, + syscall.ESPIPE: ErrIllegalSeek, + syscall.EROFS: ErrReadOnlyFS, + syscall.EMLINK: ErrTooManyLinks, + syscall.EPIPE: ErrBrokenPipe, + syscall.EDOM: ErrDomain, + syscall.ERANGE: ErrRange, + syscall.EDEADLOCK: ErrDeadlock, + syscall.ENAMETOOLONG: ErrNameTooLong, + syscall.ENOLCK: ErrNoLocksAvailable, + syscall.ENOSYS: ErrInvalidSyscall, + syscall.ENOTEMPTY: ErrDirNotEmpty, + syscall.ELOOP: ErrLinkLoop, + syscall.ENOMSG: ErrNoMessage, + syscall.EIDRM: ErrIdentifierRemoved, + syscall.ECHRNG: ErrChannelOutOfRange, + syscall.EL2NSYNC: ErrLevelTwoNotSynced, + syscall.EL3HLT: ErrLevelThreeHalted, + syscall.EL3RST: ErrLevelThreeReset, + syscall.ELNRNG: ErrLinkNumberOutOfRange, + syscall.EUNATCH: ErrProtocolDriverNotAttached, + syscall.ENOCSI: ErrNoCSIAvailable, + syscall.EL2HLT: ErrLevelTwoHalted, + syscall.EBADE: ErrInvalidExchange, + syscall.EBADR: ErrInvalidRequestDescriptor, + syscall.EXFULL: ErrExchangeFull, + syscall.ENOANO: ErrNoAnode, + syscall.EBADRQC: ErrInvalidRequestCode, + syscall.EBADSLT: ErrInvalidSlot, + syscall.EBFONT: ErrBadFontFile, + syscall.ENOSTR: ErrNotStream, + syscall.ENODATA: ErrNoDataAvailable, + syscall.ETIME: ErrTimerExpired, + syscall.ENOSR: ErrStreamsResourceDepleted, + syscall.ENONET: ErrMachineNotOnNetwork, + syscall.ENOPKG: ErrPackageNotInstalled, + syscall.EREMOTE: ErrIsRemote, + syscall.ENOLINK: ErrNoLink, + syscall.EADV: ErrAdvertise, + syscall.ESRMNT: ErrSRMount, + syscall.ECOMM: ErrSendCommunication, + syscall.EPROTO: ErrProtocol, + syscall.EMULTIHOP: ErrMultihopAttempted, + syscall.EDOTDOT: ErrRFS, + syscall.EBADMSG: ErrInvalidDataMessage, + syscall.EOVERFLOW: ErrOverflow, + syscall.ENOTUNIQ: ErrNetworkNameNotUnique, + syscall.EBADFD: ErrFDInBadState, + syscall.EREMCHG: ErrRemoteAddressChanged, + syscall.ELIBACC: ErrSharedLibraryInaccessible, + syscall.ELIBBAD: ErrCorruptedSharedLibrary, + syscall.ELIBSCN: ErrLibSectionCorrupted, + syscall.ELIBMAX: ErrTooManySharedLibraries, + syscall.ELIBEXEC: ErrSharedLibraryExeced, + syscall.EILSEQ: ErrIllegalByteSequence, + syscall.ERESTART: ErrShouldRestart, + syscall.ESTRPIPE: ErrStreamPipe, + syscall.EUSERS: ErrTooManyUsers, + syscall.ENOTSOCK: ErrNotASocket, + syscall.EDESTADDRREQ: ErrDestinationAddressRequired, + syscall.EMSGSIZE: ErrMessageTooLong, + syscall.EPROTOTYPE: ErrWrongProtocolForSocket, + syscall.ENOPROTOOPT: ErrProtocolNotAvailable, + syscall.EPROTONOSUPPORT: ErrProtocolNotSupported, + syscall.ESOCKTNOSUPPORT: ErrSocketNotSupported, + syscall.EOPNOTSUPP: ErrEndpointOperation, + syscall.EPFNOSUPPORT: ErrProtocolFamilyNotSupported, + syscall.EAFNOSUPPORT: ErrAddressFamilyNotSupported, + syscall.EADDRINUSE: ErrAddressInUse, + syscall.EADDRNOTAVAIL: ErrAddressNotAvailable, + syscall.ENETDOWN: ErrNetworkDown, + syscall.ENETUNREACH: ErrNetworkUnreachable, + syscall.ENETRESET: ErrNetworkReset, + syscall.ECONNABORTED: ErrConnectionAborted, + syscall.ECONNRESET: ErrConnectionReset, + syscall.ENOBUFS: ErrNoBufferSpace, + syscall.EISCONN: ErrAlreadyConnected, + syscall.ENOTCONN: ErrNotConnected, + syscall.ESHUTDOWN: ErrShutdown, + syscall.ETOOMANYREFS: ErrTooManyRefs, + syscall.ETIMEDOUT: ErrTimedOut, + syscall.ECONNREFUSED: ErrConnectionRefused, + syscall.EHOSTDOWN: ErrHostDown, + syscall.EHOSTUNREACH: ErrNoRoute, + syscall.EALREADY: ErrAlreadyInProgress, + syscall.EINPROGRESS: ErrInProgress, + syscall.ESTALE: ErrStaleFileHandle, + syscall.EUCLEAN: ErrStructureNeedsCleaning, + syscall.ENOTNAM: ErrIsNamedFile, + syscall.EREMOTEIO: ErrRemoteIO, + syscall.EDQUOT: ErrQuotaExceeded, + syscall.ENOMEDIUM: ErrNoMedium, + syscall.EMEDIUMTYPE: ErrWrongMediumType, + syscall.ECANCELED: ErrCanceled, + syscall.ENOKEY: ErrNoKey, + syscall.EKEYEXPIRED: ErrKeyExpired, + syscall.EKEYREVOKED: ErrKeyRevoked, + syscall.EKEYREJECTED: ErrKeyRejected, + syscall.EOWNERDEAD: ErrOwnerDied, + syscall.ENOTRECOVERABLE: ErrNotRecoverable, +} + +// FromHost translates a syscall.Errno to a corresponding Error value. +func FromHost(err syscall.Errno) *Error { + e, ok := linuxHostTranslations[err] + if !ok { + panic("Unknown host errno " + err.Error()) + } + return e +} diff --git a/pkg/syserr/linuxabi.go b/pkg/syserr/linuxabi.go new file mode 100644 index 000000000..71e3d1a81 --- /dev/null +++ b/pkg/syserr/linuxabi.go @@ -0,0 +1,30 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package syserr + +import ( + "gvisor.googlesource.com/gvisor/pkg/abi/linux" +) + +var linuxABITranslations = map[*Error]*linux.Errno{} + +// ToLinux translates an Error to a corresponding *linux.Errno value. +func ToLinux(err *Error) *linux.Errno { + le, ok := linuxABITranslations[err] + if !ok { + panic("No Linux ABI translation available for " + err.String()) + } + return le +} diff --git a/pkg/syserr/netstack.go b/pkg/syserr/netstack.go new file mode 100644 index 000000000..36726e967 --- /dev/null +++ b/pkg/syserr/netstack.go @@ -0,0 +1,93 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package syserr + +import ( + "gvisor.googlesource.com/gvisor/pkg/abi/linux" + "gvisor.googlesource.com/gvisor/pkg/tcpip" +) + +// Mapping for tcpip.Error types. +var ( + ErrUnknownProtocol = New(tcpip.ErrUnknownProtocol.String(), linux.EINVAL) + ErrUnknownNICID = New(tcpip.ErrUnknownNICID.String(), linux.EINVAL) + ErrUnknownProtocolOption = New(tcpip.ErrUnknownProtocolOption.String(), linux.ENOPROTOOPT) + ErrDuplicateNICID = New(tcpip.ErrDuplicateNICID.String(), linux.EEXIST) + ErrDuplicateAddress = New(tcpip.ErrDuplicateAddress.String(), linux.EEXIST) + ErrBadLinkEndpoint = New(tcpip.ErrBadLinkEndpoint.String(), linux.EINVAL) + ErrAlreadyBound = New(tcpip.ErrAlreadyBound.String(), linux.EINVAL) + ErrInvalidEndpointState = New(tcpip.ErrInvalidEndpointState.String(), linux.EINVAL) + ErrAlreadyConnecting = New(tcpip.ErrAlreadyConnecting.String(), linux.EALREADY) + ErrNoPortAvailable = New(tcpip.ErrNoPortAvailable.String(), linux.EAGAIN) + ErrPortInUse = New(tcpip.ErrPortInUse.String(), linux.EADDRINUSE) + ErrBadLocalAddress = New(tcpip.ErrBadLocalAddress.String(), linux.EADDRNOTAVAIL) + ErrClosedForSend = New(tcpip.ErrClosedForSend.String(), linux.EPIPE) + ErrClosedForReceive = New(tcpip.ErrClosedForReceive.String(), nil) + ErrTimeout = New(tcpip.ErrTimeout.String(), linux.ETIMEDOUT) + ErrAborted = New(tcpip.ErrAborted.String(), linux.EPIPE) + ErrConnectStarted = New(tcpip.ErrConnectStarted.String(), linux.EINPROGRESS) + ErrDestinationRequired = New(tcpip.ErrDestinationRequired.String(), linux.EDESTADDRREQ) + ErrNotSupported = New(tcpip.ErrNotSupported.String(), linux.EOPNOTSUPP) + ErrQueueSizeNotSupported = New(tcpip.ErrQueueSizeNotSupported.String(), linux.ENOTTY) + ErrNoSuchFile = New(tcpip.ErrNoSuchFile.String(), linux.ENOENT) + ErrInvalidOptionValue = New(tcpip.ErrInvalidOptionValue.String(), linux.EINVAL) +) + +var netstackErrorTranslations = map[*tcpip.Error]*Error{ + tcpip.ErrUnknownProtocol: ErrUnknownProtocol, + tcpip.ErrUnknownNICID: ErrUnknownNICID, + tcpip.ErrUnknownProtocolOption: ErrUnknownProtocolOption, + tcpip.ErrDuplicateNICID: ErrDuplicateNICID, + tcpip.ErrDuplicateAddress: ErrDuplicateAddress, + tcpip.ErrNoRoute: ErrNoRoute, + tcpip.ErrBadLinkEndpoint: ErrBadLinkEndpoint, + tcpip.ErrAlreadyBound: ErrAlreadyBound, + tcpip.ErrInvalidEndpointState: ErrInvalidEndpointState, + tcpip.ErrAlreadyConnecting: ErrAlreadyConnecting, + tcpip.ErrAlreadyConnected: ErrAlreadyConnected, + tcpip.ErrNoPortAvailable: ErrNoPortAvailable, + tcpip.ErrPortInUse: ErrPortInUse, + tcpip.ErrBadLocalAddress: ErrBadLocalAddress, + tcpip.ErrClosedForSend: ErrClosedForSend, + tcpip.ErrClosedForReceive: ErrClosedForReceive, + tcpip.ErrWouldBlock: ErrWouldBlock, + tcpip.ErrConnectionRefused: ErrConnectionRefused, + tcpip.ErrTimeout: ErrTimeout, + tcpip.ErrAborted: ErrAborted, + tcpip.ErrConnectStarted: ErrConnectStarted, + tcpip.ErrDestinationRequired: ErrDestinationRequired, + tcpip.ErrNotSupported: ErrNotSupported, + tcpip.ErrQueueSizeNotSupported: ErrQueueSizeNotSupported, + tcpip.ErrNotConnected: ErrNotConnected, + tcpip.ErrConnectionReset: ErrConnectionReset, + tcpip.ErrConnectionAborted: ErrConnectionAborted, + tcpip.ErrNoSuchFile: ErrNoSuchFile, + tcpip.ErrInvalidOptionValue: ErrInvalidOptionValue, + tcpip.ErrNoLinkAddress: ErrHostDown, + tcpip.ErrBadAddress: ErrBadAddress, +} + +// TranslateNetstackError converts an error from the tcpip package to a sentry +// internal error. +func TranslateNetstackError(err *tcpip.Error) *Error { + if err == nil { + return nil + } + se, ok := netstackErrorTranslations[err] + if !ok { + panic("Unknown error: " + err.String()) + } + return se +} diff --git a/pkg/syserr/syserr.go b/pkg/syserr/syserr.go new file mode 100644 index 000000000..eaa0ec920 --- /dev/null +++ b/pkg/syserr/syserr.go @@ -0,0 +1,236 @@ +// Copyright 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package syserr contains sandbox-internal errors. These errors are distinct +// from both the errors returned by host system calls and the errors returned +// to sandboxed applications. +package syserr + +import ( + "fmt" + "syscall" + + "gvisor.googlesource.com/gvisor/pkg/abi/linux" + "gvisor.googlesource.com/gvisor/pkg/syserror" +) + +// Error represents an internal error. +type Error struct { + string +} + +// New creates a new Error and adds a translation for it. +func New(message string, linuxTranslation *linux.Errno) *Error { + err := &Error{message} + linuxABITranslations[err] = linuxTranslation + + // TODO: Remove this. + if linuxTranslation == nil { + linuxBackwardsTranslations[err] = nil + } else { + e := error(syscall.Errno(linuxTranslation.Number())) + // syserror.ErrWouldBlock gets translated to syserror.EWOULDBLOCK and + // enables proper blocking semantics. This should temporary address the + // class of blocking bugs that keep popping up with the current state of + // the error space. + if e == syserror.EWOULDBLOCK { + e = syserror.ErrWouldBlock + } + linuxBackwardsTranslations[err] = e + } + + return err +} + +// NewWithoutTranslation creates a new Error. If translation is attempted on +// the error, translation will fail. +func NewWithoutTranslation(message string) *Error { + return &Error{message} +} + +// String implements fmt.Stringer.String. +func (e *Error) String() string { + if e == nil { + return "<nil>" + } + return e.string +} + +// TODO: Remove this. +var linuxBackwardsTranslations = map[*Error]error{} + +// ToError translates an Error to a corresponding error value. +// +// TODO: Remove this. +func (e *Error) ToError() error { + if e == nil { + return nil + } + err, ok := linuxBackwardsTranslations[e] + if !ok { + panic(fmt.Sprintf("unknown error: %q", e.string)) + } + return err +} + +// TODO: Remove or replace most of these errors. +// +// Some of the errors should be replaced with package specific errors and +// others should be removed entirely. +var ( + ErrNotPermitted = New("operation not permitted", linux.EPERM) + ErrNoFileOrDir = New("no such file or directory", linux.ENOENT) + ErrNoProcess = New("no such process", linux.ESRCH) + ErrInterrupted = New("interrupted system call", linux.EINTR) + ErrIO = New("I/O error", linux.EIO) + ErrDeviceOrAddress = New("no such device or address", linux.ENXIO) + ErrTooManyArgs = New("argument list too long", linux.E2BIG) + ErrEcec = New("exec format error", linux.ENOEXEC) + ErrBadFD = New("bad file number", linux.EBADF) + ErrNoChild = New("no child processes", linux.ECHILD) + ErrTryAgain = New("try again", linux.EAGAIN) + ErrNoMemory = New("out of memory", linux.ENOMEM) + ErrPermissionDenied = New("permission denied", linux.EACCES) + ErrBadAddress = New("bad address", linux.EFAULT) + ErrNotBlockDevice = New("block device required", linux.ENOTBLK) + ErrBusy = New("device or resource busy", linux.EBUSY) + ErrExists = New("file exists", linux.EEXIST) + ErrCrossDeviceLink = New("cross-device link", linux.EXDEV) + ErrNoDevice = New("no such device", linux.ENODEV) + ErrNotDir = New("not a directory", linux.ENOTDIR) + ErrIsDir = New("is a directory", linux.EISDIR) + ErrInvalidArgument = New("invalid argument", linux.EINVAL) + ErrFileTableOverflow = New("file table overflow", linux.ENFILE) + ErrTooManyOpenFiles = New("too many open files", linux.EMFILE) + ErrNotTTY = New("not a typewriter", linux.ENOTTY) + ErrTestFileBusy = New("text file busy", linux.ETXTBSY) + ErrFileTooBig = New("file too large", linux.EFBIG) + ErrNoSpace = New("no space left on device", linux.ENOSPC) + ErrIllegalSeek = New("illegal seek", linux.ESPIPE) + ErrReadOnlyFS = New("read-only file system", linux.EROFS) + ErrTooManyLinks = New("too many links", linux.EMLINK) + ErrBrokenPipe = New("broken pipe", linux.EPIPE) + ErrDomain = New("math argument out of domain of func", linux.EDOM) + ErrRange = New("math result not representable", linux.ERANGE) + ErrDeadlock = New("resource deadlock would occur", linux.EDEADLOCK) + ErrNameTooLong = New("file name too long", linux.ENAMETOOLONG) + ErrNoLocksAvailable = New("no record locks available", linux.ENOLCK) + ErrInvalidSyscall = New("invalid system call number", linux.ENOSYS) + ErrDirNotEmpty = New("directory not empty", linux.ENOTEMPTY) + ErrLinkLoop = New("too many symbolic links encountered", linux.ELOOP) + ErrWouldBlock = New("operation would block", linux.EWOULDBLOCK) + ErrNoMessage = New("no message of desired type", linux.ENOMSG) + ErrIdentifierRemoved = New("identifier removed", linux.EIDRM) + ErrChannelOutOfRange = New("channel number out of range", linux.ECHRNG) + ErrLevelTwoNotSynced = New("level 2 not synchronized", linux.EL2NSYNC) + ErrLevelThreeHalted = New("level 3 halted", linux.EL3HLT) + ErrLevelThreeReset = New("level 3 reset", linux.EL3RST) + ErrLinkNumberOutOfRange = New("link number out of range", linux.ELNRNG) + ErrProtocolDriverNotAttached = New("protocol driver not attached", linux.EUNATCH) + ErrNoCSIAvailable = New("no CSI structure available", linux.ENOCSI) + ErrLevelTwoHalted = New("level 2 halted", linux.EL2HLT) + ErrInvalidExchange = New("invalid exchange", linux.EBADE) + ErrInvalidRequestDescriptor = New("invalid request descriptor", linux.EBADR) + ErrExchangeFull = New("exchange full", linux.EXFULL) + ErrNoAnode = New("no anode", linux.ENOANO) + ErrInvalidRequestCode = New("invalid request code", linux.EBADRQC) + ErrInvalidSlot = New("invalid slot", linux.EBADSLT) + ErrBadFontFile = New("bad font file format", linux.EBFONT) + ErrNotStream = New("device not a stream", linux.ENOSTR) + ErrNoDataAvailable = New("no data available", linux.ENODATA) + ErrTimerExpired = New("timer expired", linux.ETIME) + ErrStreamsResourceDepleted = New("out of streams resources", linux.ENOSR) + ErrMachineNotOnNetwork = New("machine is not on the network", linux.ENONET) + ErrPackageNotInstalled = New("package not installed", linux.ENOPKG) + ErrIsRemote = New("object is remote", linux.EREMOTE) + ErrNoLink = New("link has been severed", linux.ENOLINK) + ErrAdvertise = New("advertise error", linux.EADV) + ErrSRMount = New("srmount error", linux.ESRMNT) + ErrSendCommunication = New("communication error on send", linux.ECOMM) + ErrProtocol = New("protocol error", linux.EPROTO) + ErrMultihopAttempted = New("multihop attempted", linux.EMULTIHOP) + ErrRFS = New("RFS specific error", linux.EDOTDOT) + ErrInvalidDataMessage = New("not a data message", linux.EBADMSG) + ErrOverflow = New("value too large for defined data type", linux.EOVERFLOW) + ErrNetworkNameNotUnique = New("name not unique on network", linux.ENOTUNIQ) + ErrFDInBadState = New("file descriptor in bad state", linux.EBADFD) + ErrRemoteAddressChanged = New("remote address changed", linux.EREMCHG) + ErrSharedLibraryInaccessible = New("can not access a needed shared library", linux.ELIBACC) + ErrCorruptedSharedLibrary = New("accessing a corrupted shared library", linux.ELIBBAD) + ErrLibSectionCorrupted = New(".lib section in a.out corrupted", linux.ELIBSCN) + ErrTooManySharedLibraries = New("attempting to link in too many shared libraries", linux.ELIBMAX) + ErrSharedLibraryExeced = New("cannot exec a shared library directly", linux.ELIBEXEC) + ErrIllegalByteSequence = New("illegal byte sequence", linux.EILSEQ) + ErrShouldRestart = New("interrupted system call should be restarted", linux.ERESTART) + ErrStreamPipe = New("streams pipe error", linux.ESTRPIPE) + ErrTooManyUsers = New("too many users", linux.EUSERS) + ErrNotASocket = New("socket operation on non-socket", linux.ENOTSOCK) + ErrDestinationAddressRequired = New("destination address required", linux.EDESTADDRREQ) + ErrMessageTooLong = New("message too long", linux.EMSGSIZE) + ErrWrongProtocolForSocket = New("protocol wrong type for socket", linux.EPROTOTYPE) + ErrProtocolNotAvailable = New("protocol not available", linux.ENOPROTOOPT) + ErrProtocolNotSupported = New("protocol not supported", linux.EPROTONOSUPPORT) + ErrSocketNotSupported = New("socket type not supported", linux.ESOCKTNOSUPPORT) + ErrEndpointOperation = New("operation not supported on transport endpoint", linux.EOPNOTSUPP) + ErrProtocolFamilyNotSupported = New("protocol family not supported", linux.EPFNOSUPPORT) + ErrAddressFamilyNotSupported = New("address family not supported by protocol", linux.EAFNOSUPPORT) + ErrAddressInUse = New("address already in use", linux.EADDRINUSE) + ErrAddressNotAvailable = New("cannot assign requested address", linux.EADDRNOTAVAIL) + ErrNetworkDown = New("network is down", linux.ENETDOWN) + ErrNetworkUnreachable = New("network is unreachable", linux.ENETUNREACH) + ErrNetworkReset = New("network dropped connection because of reset", linux.ENETRESET) + ErrConnectionAborted = New("software caused connection abort", linux.ECONNABORTED) + ErrConnectionReset = New("connection reset by peer", linux.ECONNRESET) + ErrNoBufferSpace = New("no buffer space available", linux.ENOBUFS) + ErrAlreadyConnected = New("transport endpoint is already connected", linux.EISCONN) + ErrNotConnected = New("transport endpoint is not connected", linux.ENOTCONN) + ErrShutdown = New("cannot send after transport endpoint shutdown", linux.ESHUTDOWN) + ErrTooManyRefs = New("too many references: cannot splice", linux.ETOOMANYREFS) + ErrTimedOut = New("connection timed out", linux.ETIMEDOUT) + ErrConnectionRefused = New("connection refused", linux.ECONNREFUSED) + ErrHostDown = New("host is down", linux.EHOSTDOWN) + ErrNoRoute = New("no route to host", linux.EHOSTUNREACH) + ErrAlreadyInProgress = New("operation already in progress", linux.EALREADY) + ErrInProgress = New("operation now in progress", linux.EINPROGRESS) + ErrStaleFileHandle = New("stale file handle", linux.ESTALE) + ErrStructureNeedsCleaning = New("structure needs cleaning", linux.EUCLEAN) + ErrIsNamedFile = New("is a named type file", linux.ENOTNAM) + ErrRemoteIO = New("remote I/O error", linux.EREMOTEIO) + ErrQuotaExceeded = New("quota exceeded", linux.EDQUOT) + ErrNoMedium = New("no medium found", linux.ENOMEDIUM) + ErrWrongMediumType = New("wrong medium type", linux.EMEDIUMTYPE) + ErrCanceled = New("operation Canceled", linux.ECANCELED) + ErrNoKey = New("required key not available", linux.ENOKEY) + ErrKeyExpired = New("key has expired", linux.EKEYEXPIRED) + ErrKeyRevoked = New("key has been revoked", linux.EKEYREVOKED) + ErrKeyRejected = New("key was rejected by service", linux.EKEYREJECTED) + ErrOwnerDied = New("owner died", linux.EOWNERDEAD) + ErrNotRecoverable = New("state not recoverable", linux.ENOTRECOVERABLE) +) + +// FromError converts a generic error to an *Error. +// +// TODO: Remove this function. +func FromError(err error) *Error { + if err == nil { + return nil + } + if errno, ok := err.(syscall.Errno); ok { + return FromHost(errno) + } + if errno, ok := syserror.TranslateError(err); ok { + return FromHost(errno) + } + panic("unknown error: " + err.Error()) +} |