//+private
package os2

import "core:sys/unix"

EPERM          :: 1
ENOENT         :: 2
ESRCH          :: 3
EINTR          :: 4
EIO            :: 5
ENXIO          :: 6
EBADF          :: 9
EAGAIN         :: 11
ENOMEM         :: 12
EACCES         :: 13
EFAULT         :: 14
EEXIST         :: 17
ENODEV         :: 19
ENOTDIR        :: 20
EISDIR         :: 21
EINVAL         :: 22
ENFILE         :: 23
EMFILE         :: 24
ETXTBSY        :: 26
EFBIG          :: 27
ENOSPC         :: 28
ESPIPE         :: 29
EROFS          :: 30
EPIPE          :: 32
ERANGE         :: 34   /* Result too large */
EDEADLK        :: 35   /* Resource deadlock would occur */
ENAMETOOLONG   :: 36   /* File name too long */
ENOLCK         :: 37   /* No record locks available */
ENOSYS         :: 38   /* Invalid system call number */
ENOTEMPTY      :: 39   /* Directory not empty */
ELOOP          :: 40   /* Too many symbolic links encountered */
EWOULDBLOCK    :: EAGAIN /* Operation would block */
ENOMSG         :: 42   /* No message of desired type */
EIDRM          :: 43   /* Identifier removed */
ECHRNG         :: 44   /* Channel number out of range */
EL2NSYNC       :: 45   /* Level 2 not synchronized */
EL3HLT         :: 46   /* Level 3 halted */
EL3RST         :: 47   /* Level 3 reset */
ELNRNG         :: 48   /* Link number out of range */
EUNATCH        :: 49   /* Protocol driver not attached */
ENOCSI         :: 50   /* No CSI structure available */
EL2HLT         :: 51   /* Level 2 halted */
EBADE          :: 52   /* Invalid exchange */
EBADR          :: 53   /* Invalid request descriptor */
EXFULL         :: 54   /* Exchange full */
ENOANO         :: 55   /* No anode */
EBADRQC        :: 56   /* Invalid request code */
EBADSLT        :: 57   /* Invalid slot */
EDEADLOCK      :: EDEADLK
EBFONT         :: 59   /* Bad font file format */
ENOSTR         :: 60   /* Device not a stream */
ENODATA        :: 61   /* No data available */
ETIME          :: 62   /* Timer expired */
ENOSR          :: 63   /* Out of streams resources */
ENONET         :: 64   /* Machine is not on the network */
ENOPKG         :: 65   /* Package not installed */
EREMOTE        :: 66   /* Object is remote */
ENOLINK        :: 67   /* Link has been severed */
EADV           :: 68   /* Advertise error */
ESRMNT         :: 69   /* Srmount error */
ECOMM          :: 70   /* Communication error on send */
EPROTO         :: 71   /* Protocol error */
EMULTIHOP      :: 72   /* Multihop attempted */
EDOTDOT        :: 73   /* RFS specific error */
EBADMSG        :: 74   /* Not a data message */
EOVERFLOW      :: 75   /* Value too large for defined data type */
ENOTUNIQ       :: 76   /* Name not unique on network */
EBADFD         :: 77   /* File descriptor in bad state */
EREMCHG        :: 78   /* Remote address changed */
ELIBACC        :: 79   /* Can not access a needed shared library */
ELIBBAD        :: 80   /* Accessing a corrupted shared library */
ELIBSCN        :: 81   /* .lib section in a.out corrupted */
ELIBMAX        :: 82   /* Attempting to link in too many shared libraries */
ELIBEXEC       :: 83   /* Cannot exec a shared library directly */
EILSEQ         :: 84   /* Illegal byte sequence */
ERESTART       :: 85   /* Interrupted system call should be restarted */
ESTRPIPE       :: 86   /* Streams pipe error */
EUSERS         :: 87   /* Too many users */
ENOTSOCK       :: 88   /* Socket operation on non-socket */
EDESTADDRREQ   :: 89   /* Destination address required */
EMSGSIZE       :: 90   /* Message too long */
EPROTOTYPE     :: 91   /* Protocol wrong type for socket */
ENOPROTOOPT    :: 92   /* Protocol not available */
EPROTONOSUPPORT:: 93   /* Protocol not supported */
ESOCKTNOSUPPORT:: 94   /* Socket type not supported */
EOPNOTSUPP     :: 95   /* Operation not supported on transport endpoint */
EPFNOSUPPORT   :: 96   /* Protocol family not supported */
EAFNOSUPPORT   :: 97   /* Address family not supported by protocol */
EADDRINUSE     :: 98   /* Address already in use */
EADDRNOTAVAIL  :: 99   /* Cannot assign requested address */
ENETDOWN       :: 100  /* Network is down */
ENETUNREACH    :: 101  /* Network is unreachable */
ENETRESET      :: 102  /* Network dropped connection because of reset */
ECONNABORTED   :: 103  /* Software caused connection abort */
ECONNRESET     :: 104  /* Connection reset by peer */
ENOBUFS        :: 105  /* No buffer space available */
EISCONN        :: 106  /* Transport endpoint is already connected */
ENOTCONN       :: 107  /* Transport endpoint is not connected */
ESHUTDOWN      :: 108  /* Cannot send after transport endpoint shutdown */
ETOOMANYREFS   :: 109  /* Too many references: cannot splice */
ETIMEDOUT      :: 110  /* Connection timed out */
ECONNREFUSED   :: 111  /* Connection refused */
EHOSTDOWN      :: 112  /* Host is down */
EHOSTUNREACH   :: 113  /* No route to host */
EALREADY       :: 114  /* Operation already in progress */
EINPROGRESS    :: 115  /* Operation now in progress */
ESTALE         :: 116  /* Stale file handle */
EUCLEAN        :: 117  /* Structure needs cleaning */
ENOTNAM        :: 118  /* Not a XENIX named type file */
ENAVAIL        :: 119  /* No XENIX semaphores available */
EISNAM         :: 120  /* Is a named type file */
EREMOTEIO      :: 121  /* Remote I/O error */
EDQUOT         :: 122  /* Quota exceeded */
ENOMEDIUM      :: 123  /* No medium found */
EMEDIUMTYPE    :: 124  /* Wrong medium type */
ECANCELED      :: 125  /* Operation Canceled */
ENOKEY         :: 126  /* Required key not available */
EKEYEXPIRED    :: 127  /* Key has expired */
EKEYREVOKED    :: 128  /* Key has been revoked */
EKEYREJECTED   :: 129  /* Key was rejected by service */
EOWNERDEAD     :: 130  /* Owner died */
ENOTRECOVERABLE:: 131  /* State not recoverable */
ERFKILL        :: 132  /* Operation not possible due to RF-kill */
EHWPOISON      :: 133  /* Memory page has hardware error */

_get_platform_error :: proc(res: int) -> Error {
	errno := unix.get_errno(res)
	return Platform_Error(i32(errno))
}

_ok_or_error :: proc(res: int) -> Error {
	return res >= 0 ? nil : _get_platform_error(res)
}

_error_string :: proc(errno: i32) -> string {
	if errno == 0 {
		return ""
	}
	return "Error"
}
