// Copyright 2018 The gVisor Authors.
//
// 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 linux

// Errno represents a Linux errno value.
type Errno struct {
	number int
	name   string
}

// Number returns the errno number.
func (e *Errno) Number() int {
	return e.number
}

// String implements fmt.Stringer.String.
func (e *Errno) String() string {
	return e.name
}

// Errno values from include/uapi/asm-generic/errno-base.h.
var (
	EPERM   = &Errno{1, "operation not permitted"}
	ENOENT  = &Errno{2, "no such file or directory"}
	ESRCH   = &Errno{3, "no such process"}
	EINTR   = &Errno{4, "interrupted system call"}
	EIO     = &Errno{5, "I/O error"}
	ENXIO   = &Errno{6, "no such device or address"}
	E2BIG   = &Errno{7, "argument list too long"}
	ENOEXEC = &Errno{8, "exec format error"}
	EBADF   = &Errno{9, "bad file number"}
	ECHILD  = &Errno{10, "no child processes"}
	EAGAIN  = &Errno{11, "try again"}
	ENOMEM  = &Errno{12, "out of memory"}
	EACCES  = &Errno{13, "permission denied"}
	EFAULT  = &Errno{14, "bad address"}
	ENOTBLK = &Errno{15, "block device required"}
	EBUSY   = &Errno{16, "device or resource busy"}
	EEXIST  = &Errno{17, "file exists"}
	EXDEV   = &Errno{18, "cross-device link"}
	ENODEV  = &Errno{19, "no such device"}
	ENOTDIR = &Errno{20, "not a directory"}
	EISDIR  = &Errno{21, "is a directory"}
	EINVAL  = &Errno{22, "invalid argument"}
	ENFILE  = &Errno{23, "file table overflow"}
	EMFILE  = &Errno{24, "too many open files"}
	ENOTTY  = &Errno{25, "not a typewriter"}
	ETXTBSY = &Errno{26, "text file busy"}
	EFBIG   = &Errno{27, "file too large"}
	ENOSPC  = &Errno{28, "no space left on device"}
	ESPIPE  = &Errno{29, "illegal seek"}
	EROFS   = &Errno{30, "read-only file system"}
	EMLINK  = &Errno{31, "too many links"}
	EPIPE   = &Errno{32, "broken pipe"}
	EDOM    = &Errno{33, "math argument out of domain of func"}
	ERANGE  = &Errno{34, "math result not representable"}
)

// Errno values from include/uapi/asm-generic/errno.h.
var (
	EDEADLK         = &Errno{35, "resource deadlock would occur"}
	ENAMETOOLONG    = &Errno{36, "file name too long"}
	ENOLCK          = &Errno{37, "no record locks available"}
	ENOSYS          = &Errno{38, "invalid system call number"}
	ENOTEMPTY       = &Errno{39, "directory not empty"}
	ELOOP           = &Errno{40, "too many symbolic links encountered"}
	EWOULDBLOCK     = &Errno{EAGAIN.number, "operation would block"}
	ENOMSG          = &Errno{42, "no message of desired type"}
	EIDRM           = &Errno{43, "identifier removed"}
	ECHRNG          = &Errno{44, "channel number out of range"}
	EL2NSYNC        = &Errno{45, "level 2 not synchronized"}
	EL3HLT          = &Errno{46, "level 3 halted"}
	EL3RST          = &Errno{47, "level 3 reset"}
	ELNRNG          = &Errno{48, "link number out of range"}
	EUNATCH         = &Errno{49, "protocol driver not attached"}
	ENOCSI          = &Errno{50, "no CSI structure available"}
	EL2HLT          = &Errno{51, "level 2 halted"}
	EBADE           = &Errno{52, "invalid exchange"}
	EBADR           = &Errno{53, "invalid request descriptor"}
	EXFULL          = &Errno{54, "exchange full"}
	ENOANO          = &Errno{55, "no anode"}
	EBADRQC         = &Errno{56, "invalid request code"}
	EBADSLT         = &Errno{57, "invalid slot"}
	EDEADLOCK       = EDEADLK
	EBFONT          = &Errno{59, "bad font file format"}
	ENOSTR          = &Errno{60, "device not a stream"}
	ENODATA         = &Errno{61, "no data available"}
	ETIME           = &Errno{62, "timer expired"}
	ENOSR           = &Errno{63, "out of streams resources"}
	ENONET          = &Errno{64, "machine is not on the network"}
	ENOPKG          = &Errno{65, "package not installed"}
	EREMOTE         = &Errno{66, "object is remote"}
	ENOLINK         = &Errno{67, "link has been severed"}
	EADV            = &Errno{68, "advertise error"}
	ESRMNT          = &Errno{69, "srmount error"}
	ECOMM           = &Errno{70, "communication error on send"}
	EPROTO          = &Errno{71, "protocol error"}
	EMULTIHOP       = &Errno{72, "multihop attempted"}
	EDOTDOT         = &Errno{73, "RFS specific error"}
	EBADMSG         = &Errno{74, "not a data message"}
	EOVERFLOW       = &Errno{75, "value too large for defined data type"}
	ENOTUNIQ        = &Errno{76, "name not unique on network"}
	EBADFD          = &Errno{77, "file descriptor in bad state"}
	EREMCHG         = &Errno{78, "remote address changed"}
	ELIBACC         = &Errno{79, "can not access a needed shared library"}
	ELIBBAD         = &Errno{80, "accessing a corrupted shared library"}
	ELIBSCN         = &Errno{81, ".lib section in a.out corrupted"}
	ELIBMAX         = &Errno{82, "attempting to link in too many shared libraries"}
	ELIBEXEC        = &Errno{83, "cannot exec a shared library directly"}
	EILSEQ          = &Errno{84, "illegal byte sequence"}
	ERESTART        = &Errno{85, "interrupted system call should be restarted"}
	ESTRPIPE        = &Errno{86, "streams pipe error"}
	EUSERS          = &Errno{87, "too many users"}
	ENOTSOCK        = &Errno{88, "socket operation on non-socket"}
	EDESTADDRREQ    = &Errno{89, "destination address required"}
	EMSGSIZE        = &Errno{90, "message too long"}
	EPROTOTYPE      = &Errno{91, "protocol wrong type for socket"}
	ENOPROTOOPT     = &Errno{92, "protocol not available"}
	EPROTONOSUPPORT = &Errno{93, "protocol not supported"}
	ESOCKTNOSUPPORT = &Errno{94, "socket type not supported"}
	EOPNOTSUPP      = &Errno{95, "operation not supported on transport endpoint"}
	EPFNOSUPPORT    = &Errno{96, "protocol family not supported"}
	EAFNOSUPPORT    = &Errno{97, "address family not supported by protocol"}
	EADDRINUSE      = &Errno{98, "address already in use"}
	EADDRNOTAVAIL   = &Errno{99, "cannot assign requested address"}
	ENETDOWN        = &Errno{100, "network is down"}
	ENETUNREACH     = &Errno{101, "network is unreachable"}
	ENETRESET       = &Errno{102, "network dropped connection because of reset"}
	ECONNABORTED    = &Errno{103, "software caused connection abort"}
	ECONNRESET      = &Errno{104, "connection reset by peer"}
	ENOBUFS         = &Errno{105, "no buffer space available"}
	EISCONN         = &Errno{106, "transport endpoint is already connected"}
	ENOTCONN        = &Errno{107, "transport endpoint is not connected"}
	ESHUTDOWN       = &Errno{108, "cannot send after transport endpoint shutdown"}
	ETOOMANYREFS    = &Errno{109, "too many references: cannot splice"}
	ETIMEDOUT       = &Errno{110, "connection timed out"}
	ECONNREFUSED    = &Errno{111, "connection refused"}
	EHOSTDOWN       = &Errno{112, "host is down"}
	EHOSTUNREACH    = &Errno{113, "no route to host"}
	EALREADY        = &Errno{114, "operation already in progress"}
	EINPROGRESS     = &Errno{115, "operation now in progress"}
	ESTALE          = &Errno{116, "stale file handle"}
	EUCLEAN         = &Errno{117, "structure needs cleaning"}
	ENOTNAM         = &Errno{118, "not a XENIX named type file"}
	ENAVAIL         = &Errno{119, "no XENIX semaphores available"}
	EISNAM          = &Errno{120, "is a named type file"}
	EREMOTEIO       = &Errno{121, "remote I/O error"}
	EDQUOT          = &Errno{122, "quota exceeded"}
	ENOMEDIUM       = &Errno{123, "no medium found"}
	EMEDIUMTYPE     = &Errno{124, "wrong medium type"}
	ECANCELED       = &Errno{125, "operation Canceled"}
	ENOKEY          = &Errno{126, "required key not available"}
	EKEYEXPIRED     = &Errno{127, "key has expired"}
	EKEYREVOKED     = &Errno{128, "key has been revoked"}
	EKEYREJECTED    = &Errno{129, "key was rejected by service"}
	EOWNERDEAD      = &Errno{130, "owner died"}
	ENOTRECOVERABLE = &Errno{131, "state not recoverable"}
	ERFKILL         = &Errno{132, "operation not possible due to RF-kill"}
	EHWPOISON       = &Errno{133, "memory page has hardware error"}
)