// 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
}