/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
 * Portions Copyright 2018 Devin Teske dteske@freebsd.org
 */
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

inline int EPERM = 1;
#pragma D binding "1.0" EPERM
inline int ENOENT = 2;
#pragma D binding "1.0" ENOENT
inline int ESRCH = 3;
#pragma D binding "1.0" ESRCH
inline int EINTR = 4;
#pragma D binding "1.0" EINTR
inline int EIO = 5;
#pragma D binding "1.0" EIO
inline int ENXIO = 6;
#pragma D binding "1.0" ENXIO
inline int E2BIG = 7;
#pragma D binding "1.0" E2BIG
inline int ENOEXEC = 8;
#pragma D binding "1.0" ENOEXEC
inline int EBADF = 9;
#pragma D binding "1.0" EBADF
inline int ECHILD = 10;
#pragma D binding "1.0" ECHILD
inline int EDEADLK = 11;
#pragma D binding "1.0" EDEADLK
inline int ENOMEM = 12;
#pragma D binding "1.0" ENOMEM
inline int EACCES = 13;
#pragma D binding "1.0" EACCES
inline int EFAULT = 14;
#pragma D binding "1.0" EFAULT
inline int ENOTBLK = 15;
#pragma D binding "1.0" ENOTBLK
inline int EBUSY = 16;
#pragma D binding "1.0" EBUSY
inline int EEXIST = 17;
#pragma D binding "1.0" EEXIST
inline int EXDEV = 18;
#pragma D binding "1.0" EXDEV
inline int ENODEV = 19;
#pragma D binding "1.0" ENODEV
inline int ENOTDIR = 20;
#pragma D binding "1.0" ENOTDIR
inline int EISDIR = 21;
#pragma D binding "1.0" EISDIR
inline int EINVAL = 22;
#pragma D binding "1.0" EINVAL
inline int ENFILE = 23;
#pragma D binding "1.0" ENFILE
inline int EMFILE = 24;
#pragma D binding "1.0" EMFILE
inline int ENOTTY = 25;
#pragma D binding "1.0" ENOTTY
inline int ETXTBSY = 26;
#pragma D binding "1.0" ETXTBSY
inline int EFBIG = 27;
#pragma D binding "1.0" EFBIG
inline int ENOSPC = 28;
#pragma D binding "1.0" ENOSPC
inline int ESPIPE = 29;
#pragma D binding "1.0" ESPIPE
inline int EROFS = 30;
#pragma D binding "1.0" EROFS
inline int EMLINK = 31;
#pragma D binding "1.0" EMLINK
inline int EPIPE = 32;
#pragma D binding "1.0" EPIPE
inline int EDOM = 33;
#pragma D binding "1.0" EDOM
inline int ERANGE = 34;
#pragma D binding "1.0" ERANGE
inline int EAGAIN = 35;
#pragma D binding "1.0" EAGAIN
inline int EWOULDBLOCK = EAGAIN;
#pragma D binding "1.0" EWOULDBLOCK
inline int EINPROGRESS = 36;
#pragma D binding "1.0" EINPROGRESS
inline int EALREADY = 37;
#pragma D binding "1.0" EALREADY
inline int ENOTSOCK = 38;
#pragma D binding "1.0" ENOTSOCK
inline int EDESTADDRREQ = 39;
#pragma D binding "1.0" EDESTADDRREQ
inline int EMSGSIZE = 40;
#pragma D binding "1.0" EMSGSIZE
inline int EPROTOTYPE = 41;
#pragma D binding "1.0" EPROTOTYPE
inline int ENOPROTOOPT = 42;
#pragma D binding "1.0" ENOPROTOOPT
inline int EPROTONOSUPPORT = 43;
#pragma D binding "1.0" EPROTONOSUPPORT
inline int ESOCKTNOSUPPORT = 44;
#pragma D binding "1.0" ESOCKTNOSUPPORT
inline int EOPNOTSUPP = 45;
#pragma D binding "1.0" EOPNOTSUPP
inline int ENOTSUP = EOPNOTSUPP;
#pragma D binding "1.0" ENOTSUP
inline int EPFNOSUPPORT = 46;
#pragma D binding "1.0" EPFNOSUPPORT
inline int EAFNOSUPPORT = 47;
#pragma D binding "1.0" EAFNOSUPPORT
inline int EADDRINUSE = 48;
#pragma D binding "1.0" EADDRINUSE
inline int EADDRNOTAVAIL = 49;
#pragma D binding "1.0" EADDRNOTAVAIL
inline int ENETDOWN = 50;
#pragma D binding "1.0" ENETDOWN
inline int ENETUNREACH = 51;
#pragma D binding "1.0" ENETUNREACH
inline int ENETRESET = 52;
#pragma D binding "1.0" ENETRESET
inline int ECONNABORTED = 53;
#pragma D binding "1.0" ECONNABORTED
inline int ECONNRESET = 54;
#pragma D binding "1.0" ECONNRESET
inline int ENOBUFS = 55;
#pragma D binding "1.0" ENOBUFS
inline int EISCONN = 56;
#pragma D binding "1.0" EISCONN
inline int ENOTCONN = 57;
#pragma D binding "1.0" ENOTCONN
inline int ESHUTDOWN = 58;
#pragma D binding "1.0" ESHUTDOWN
inline int ETOOMANYREFS = 59;
#pragma D binding "1.0" ETOOMANYREFS
inline int ETIMEDOUT = 60;
#pragma D binding "1.0" ETIMEDOUT
inline int ECONNREFUSED = 61;
#pragma D binding "1.0" ECONNREFUSED
inline int ELOOP = 62;
#pragma D binding "1.0" ELOOP
inline int ENAMETOOLONG = 63;
#pragma D binding "1.0" ENAMETOOLONG
inline int EHOSTDOWN = 64;
#pragma D binding "1.0" EHOSTDOWN
inline int EHOSTUNREACH = 65;
#pragma D binding "1.0" EHOSTUNREACH
inline int ENOTEMPTY = 66;
#pragma D binding "1.0" ENOTEMPTY
inline int EPROCLIM = 67;
#pragma D binding "1.0" EPROCLIM
inline int EUSERS = 68;
#pragma D binding "1.0" EUSERS
inline int EDQUOT = 69;
#pragma D binding "1.0" EDQUOT
inline int ESTALE = 70;
#pragma D binding "1.0" ESTALE
inline int EREMOTE = 71;
#pragma D binding "1.0" EREMOTE
inline int EBADRPC = 72;
#pragma D binding "1.0" EBADRPC
inline int ERPCMISMATCH = 73;
#pragma D binding "1.0" ERPCMISMATCH
inline int EPROGUNAVAIL = 74;
#pragma D binding "1.0" EPROGUNAVAIL
inline int EPROGMISMATCH = 75;
#pragma D binding "1.0" EPROGMISMATCH
inline int EPROCUNAVAIL = 76;
#pragma D binding "1.0" EPROCUNAVAIL
inline int ENOLCK = 77;
#pragma D binding "1.0" ENOLCK
inline int ENOSYS = 78;
#pragma D binding "1.0" ENOSYS
inline int EFTYPE = 79;
#pragma D binding "1.0" EFTYPE
inline int EAUTH = 80;
#pragma D binding "1.0" EAUTH
inline int ENEEDAUTH = 81;
#pragma D binding "1.0" ENEEDAUTH
inline int EIDRM = 82;
#pragma D binding "1.0" EIDRM
inline int ENOMSG = 83;
#pragma D binding "1.0" ENOMSG
inline int EOVERFLOW = 84;
#pragma D binding "1.0" EOVERFLOW
inline int ECANCELED = 85;
#pragma D binding "1.0" ECANCELED
inline int EILSEQ = 86;
#pragma D binding "1.0" EILSEQ
inline int ENOATTR = 87;
#pragma D binding "1.0" ENOATTR
inline int EDOOFUS = 88;
#pragma D binding "1.0" EDOOFUS
inline int EBADMSG = 89;
#pragma D binding "1.0" EBADMSG
inline int EMULTIHOP = 90;
#pragma D binding "1.0" EMULTIHOP
inline int ENOLINK = 91;
#pragma D binding "1.0" ENOLINK
inline int EPROTO = 92;
#pragma D binding "1.0" EPROTO
inline int ENOTCAPABLE = 93;
#pragma D binding "1.13" ENOTCAPABLE
inline int ECAPMODE = 94;
#pragma D binding "1.13" ECAPMODE
inline int ENOTRECOVERABLE = 95;
#pragma D binding "1.13" ENOTRECOVERABLE
inline int EOWNERDEAD = 96;
#pragma D binding "1.13" EOWNERDEAD
inline int EINTEGRITY = 97;
#pragma D binding "1.13" EINTEGRITY
inline int ELAST = 97;
#pragma D binding "1.0" ELAST
inline int ERESTART = -1;
#pragma D binding "1.0" ERESTART
inline int EJUSTRETURN = -2;
#pragma D binding "1.0" EJUSTRETURN
inline int ENOIOCTL = -3;
#pragma D binding "1.0" ENOIOCTL
inline int EDIRIOCTL = -4;
#pragma D binding "1.0" EDIRIOCTL
inline int ERELOOKUP = -5;
#pragma D binding "1.13" ERELOOKUP

/*
 * Error strings from <sys/errno.h>
 */
#pragma D binding "1.13" strerror
inline string strerror[int errno] =
	errno == 0 ? 			"Success" :
	errno == EPERM ?		"Operation not permitted" :
	errno == ENOENT ?		"No such file or directory" :
	errno == ESRCH ?		"No such process" :
	errno == EINTR ?		"Interrupted system call" :
	errno == EIO ?			"Input/output error" :
	errno == ENXIO ?		"Device not configured" :
	errno == E2BIG ?		"Argument list too long" :
	errno == ENOEXEC ?		"Exec format error" :
	errno == EBADF ?		"Bad file descriptor" :
	errno == ECHILD ?		"No child processes" :
	errno == EDEADLK ?		"Resource deadlock avoided" :
	errno == ENOMEM ?		"Cannot allocate memory" :
	errno == EACCES ?		"Permission denied" :
	errno == EFAULT ?		"Bad address" :
	errno == ENOTBLK ?		"Block device required" :
	errno == EBUSY ?		"Device busy" :
	errno == EEXIST ?		"File exists" :
	errno == EXDEV ?		"Cross-device link" :
	errno == ENODEV ?		"Operation not supported by device" :
	errno == ENOTDIR ?		"Not a directory" :
	errno == EISDIR ?		"Is a directory" :
	errno == EINVAL ?		"Invalid argument" :
	errno == ENFILE ?		"Too many open files in system" :
	errno == EMFILE ?		"Too many open files" :
	errno == ENOTTY ?		"Inappropriate ioctl for device" :
	errno == ETXTBSY ?		"Text file busy" :
	errno == EFBIG ?		"File too large" :
	errno == ENOSPC ?		"No space left on device" :
	errno == ESPIPE ?		"Illegal seek" :
	errno == EROFS ?		"Read-only filesystem" :
	errno == EMLINK ?		"Too many links" :
	errno == EPIPE ?		"Broken pipe" :
	errno == EDOM ?			"Numerical argument out of domain" :
	errno == ERANGE ?		"Result too large" :
	errno == EAGAIN ?		"Resource temporarily unavailable" :
	errno == EINPROGRESS ?		"Operation now in progress" :
	errno == EALREADY ?		"Operation already in progress" :
	errno == ENOTSOCK ?		"Socket operation on non-socket" :
	errno == EDESTADDRREQ ?		"Destination address required" :
	errno == EMSGSIZE ?		"Message too long" :
	errno == EPROTOTYPE ?		"Protocol wrong type for socket" :
	errno == ENOPROTOOPT ?		"Protocol not available" :
	errno == EPROTONOSUPPORT ?	"Protocol not supported" :
	errno == ESOCKTNOSUPPORT ?	"Socket type not supported" :
	errno == EOPNOTSUPP ?		"Operation not supported" :
	errno == EPFNOSUPPORT ?		"Protocol family not supported" :
	errno == EAFNOSUPPORT ?		"Address family not supported by protocol family" :
	errno == EADDRINUSE ?		"Address already in use" :
	errno == EADDRNOTAVAIL ?	"Can't assign requested address" :
	errno == ENETDOWN ?		"Network is down" :
	errno == ENETUNREACH ?		"Network is unreachable" :
	errno == ENETRESET ?		"Network dropped connection on reset" :
	errno == ECONNABORTED ?		"Software caused connection abort" :
	errno == ECONNRESET ?		"Connection reset by peer" :
	errno == ENOBUFS ?		"No buffer space available" :
	errno == EISCONN ?		"Socket is already connected" :
	errno == ENOTCONN ?		"Socket is not connected" :
	errno == ESHUTDOWN ?		"Can't send after socket shutdown" :
	errno == ETOOMANYREFS ?		"Too many references: can't splice" :
	errno == ETIMEDOUT ?		"Operation timed out" :
	errno == ECONNREFUSED ?		"Connection refused" :
	errno == ELOOP ?		"Too many levels of symbolic links" :
	errno == ENAMETOOLONG ?		"File name too long" :
	errno == EHOSTDOWN ?		"Host is down" :
	errno == EHOSTUNREACH ?		"No route to host" :
	errno == ENOTEMPTY ?		"Directory not empty" :
	errno == EPROCLIM ?		"Too many processes" :
	errno == EUSERS ?		"Too many users" :
	errno == EDQUOT ?		"Disc quota exceeded" :
	errno == ESTALE ?		"Stale NFS file handle" :
	errno == EREMOTE ?		"Too many levels of remote in path" :
	errno == EBADRPC ?		"RPC struct is bad" :
	errno == ERPCMISMATCH ?		"RPC version wrong" :
	errno == EPROGUNAVAIL ?		"RPC prog. not avail" :
	errno == EPROGMISMATCH ?	"Program version wrong" :
	errno == EPROCUNAVAIL ?		"Bad procedure for program" :
	errno == ENOLCK ?		"No locks available" :
	errno == ENOSYS ?		"Function not implemented" :
	errno == EFTYPE ?		"Inappropriate file type or format" :
	errno == EAUTH ?		"Authentication error" :
	errno == ENEEDAUTH ?		"Need authenticator" :
	errno == EIDRM ?		"Identifier removed" :
	errno == ENOMSG ?		"No message of desired type" :
	errno == EOVERFLOW ?		"Value too large to be stored in data type" :
	errno == ECANCELED ?		"Operation canceled" :
	errno == EILSEQ ?		"Illegal byte sequence" :
	errno == ENOATTR ?		"Attribute not found" :
	errno == EDOOFUS ?		"Programming error" :
	errno == EBADMSG ?		"Bad message" :
	errno == EMULTIHOP ?		"Multihop attempted" :
	errno == ENOLINK ?		"Link has been severed" :
	errno == EPROTO ?		"Protocol error" :
	errno == ENOTCAPABLE ?		"Capabilities insufficient" :
	errno == ECAPMODE ?		"Not permitted in capability mode" :
	errno == ENOTRECOVERABLE ?	"State not recoverable" :
	errno == EOWNERDEAD ?		"Previous owner died" :
	errno == EINTEGRITY ?		"Integrity check failed" :
	errno == ERESTART ?		"restart syscall" :
	errno == EJUSTRETURN ?		"don't modify regs, just return" :
	errno == ENOIOCTL ?		"ioctl not handled by this layer" :
	errno == EDIRIOCTL ?		"do direct ioctl in GEOM" :
	errno == ERELOOKUP ?		"retry the directory lookup" :
	"Unknown error";
