cosmopolitan/libc/errno.h
Justine Tunney af7bd80430
Eliminate cyclic locks in runtime
This change introduces a new deadlock detector for Cosmo's POSIX threads
implementation. Error check mutexes will now track a DAG of nested locks
and report EDEADLK when a deadlock is theoretically possible. These will
occur rarely, but it's important for production hardening your code. You
don't even need to change your mutexes to use the POSIX error check mode
because `cosmocc -mdbg` will enable error checking on mutexes by default
globally. When cycles are found, an error message showing your demangled
symbols describing the strongly connected component are printed and then
the SIGTRAP is raised, which means you'll also get a backtrace if you're
using ShowCrashReports() too. This new error checker is so low-level and
so pure that it's able to verify the relationships of every libc runtime
lock, including those locks upon which the mutex implementation depends.
2024-12-16 22:25:12 -08:00

668 lines
13 KiB
C

#ifndef COSMOPOLITAN_LIBC_ERRNO_H_
#define COSMOPOLITAN_LIBC_ERRNO_H_
COSMOPOLITAN_C_START_
/**
* @fileoverview System Five error codes.
*
* This file defines the `errno` global variable. When system calls
* (e.g. read(), write(), etc.) fail they return -1 to indicate the
* failure, and that is *the only* error return value. System calls
* also update `errno` too whenever -1 is returned (otherwise errno
* isn't changed) to be a non-zero value holding one of the numbers
* below, in order to indicate why the system call failed.
*
* There is only one exception to the above rule; some system calls
* are documented with the `@returnserrno` tag, which means they'll
* return the error number rather than stuffing it in a global. You
* can usually spot these system calls easily since most of them'll
* have names like `posix_foo()` or `pthread_bar()`.
*
* @see libc/sysv/consts.sh for assigned numbers
* @see libc/sysv/dos2errno.sh for multimapped numbers
*/
#if defined(__GNUC__) && defined(__aarch64__) && !defined(__cplusplus)
/* this header is included by 700+ files; therefore we */
/* hand-roll &__get_tls()->tib_errno to avoid #include */
/* cosmopolitan uses x28 as the tls register b/c apple */
#define errno \
(*__extension__({ \
errno_t *__ep; \
__asm__("sub\t%0,x28,#1024-0x3c" : "=r"(__ep)); \
__ep; \
}))
#else
#define errno (*__errno_location())
#endif
/**
* System call unavailable.
* @note kNtErrorInvalidFunction on NT
*/
extern const errno_t ENOSYS;
/**
* Operation not permitted.
* @note kNtErrorInvalidAccess on NT
*/
extern const errno_t EPERM;
/**
* No such file or directory.
*/
extern const errno_t ENOENT;
/**
* No such process.
*/
extern const errno_t ESRCH;
/**
* The greatest of all errnos.
*/
extern const errno_t EINTR;
/**
* Unix consensus.
*/
extern const errno_t EIO;
/**
* No such device or address.
*/
extern const errno_t ENXIO;
/**
* Argument list too long.
*/
extern const errno_t E2BIG;
/**
* Exec format error.
*/
extern const errno_t ENOEXEC;
/**
* Bad file descriptor.
*/
extern const errno_t EBADF;
/**
* No child process.
*/
extern const errno_t ECHILD;
/**
* Resource temporarily unavailable (e.g. SO_RCVTIMEO expired, too many
* processes, too much memory locked, read or write with O_NONBLOCK needs
* polling, etc.).
*/
extern const errno_t EAGAIN;
/**
* We require more vespene gas.
*/
extern const errno_t ENOMEM;
/**
* Permission denied.
*/
extern const errno_t EACCES;
/**
* Pointer passed to system call that would otherwise segfault.
*/
extern const errno_t EFAULT;
/**
* Block device required.
*/
extern const errno_t ENOTBLK;
/**
* Device or resource busy.
*/
extern const errno_t EBUSY;
/**
* File exists.
*/
extern const errno_t EEXIST;
/**
* Improper link.
*/
extern const errno_t EXDEV;
/**
* No such device.
*/
extern const errno_t ENODEV;
/**
* Not a directory.
*/
extern const errno_t ENOTDIR;
/**
* Is a a directory.
*/
extern const errno_t EISDIR;
/**
* Invalid argument.
*/
extern const errno_t EINVAL;
/**
* Too many open files in system.
*/
extern const errno_t ENFILE;
/**
* Too many open files.
*/
extern const errno_t EMFILE;
/**
* Inappropriate i/o control operation.
*/
extern const errno_t ENOTTY;
/**
* Won't open executable that's executing in write mode.
*/
extern const errno_t ETXTBSY;
/**
* File too large.
*/
extern const errno_t EFBIG;
/**
* No space left on device.
*/
extern const errno_t ENOSPC;
/**
* Disk quota exceeded.
*/
extern const errno_t EDQUOT;
/**
* Invalid seek.
*/
extern const errno_t ESPIPE;
/**
* Read-only filesystem.
*/
extern const errno_t EROFS;
/**
* Too many links.
*/
extern const errno_t EMLINK;
/**
* Broken pipe.
*/
extern const errno_t EPIPE;
/**
* Mathematics argument out of domain of function.
*/
extern const errno_t EDOM;
/**
* Result too large.
*/
extern const errno_t ERANGE;
/**
* Resource deadlock avoided.
*/
extern const errno_t EDEADLK;
/**
* Filename too long.
*/
extern const errno_t ENAMETOOLONG;
/**
* No locks available.
*/
extern const errno_t ENOLCK;
/**
* Directory not empty.
*/
extern const errno_t ENOTEMPTY;
/**
* Too many levels of symbolic links.
*/
extern const errno_t ELOOP;
/**
* No message error.
*/
extern const errno_t ENOMSG;
/**
* Identifier removed.
*/
extern const errno_t EIDRM;
/**
* Timer expired.
*/
extern const errno_t ETIME;
/**
* Protocol error.
*/
extern const errno_t EPROTO;
/**
* Overflow error.
*/
extern const errno_t EOVERFLOW;
/**
* Unicode decoding error.
*/
extern const errno_t EILSEQ;
/**
* Too many users.
*/
extern const errno_t EUSERS;
/**
* Not a socket.
*/
extern const errno_t ENOTSOCK;
/**
* Destination address required.
*/
extern const errno_t EDESTADDRREQ;
/**
* Message too long.
*/
extern const errno_t EMSGSIZE;
/**
* Protocol wrong type for socket.
*/
extern const errno_t EPROTOTYPE;
/**
* Protocol not available.
*/
extern const errno_t ENOPROTOOPT;
/**
* Protocol not supported.
*/
extern const errno_t EPROTONOSUPPORT;
/**
* Socket type not supported.
*/
extern const errno_t ESOCKTNOSUPPORT;
/**
* Operation not supported.
*/
extern const errno_t ENOTSUP;
/**
* Socket operation not supported.
*/
extern const errno_t EOPNOTSUPP;
/**
* Protocol family not supported.
*/
extern const errno_t EPFNOSUPPORT;
/**
* Address family not supported.
*/
extern const errno_t EAFNOSUPPORT;
/**
* Address already in use.
*/
extern const errno_t EADDRINUSE;
/**
* Address not available.
*/
extern const errno_t EADDRNOTAVAIL;
/**
* Network is down.
*/
extern const errno_t ENETDOWN;
/**
* Host is unreachable.
*/
extern const errno_t ENETUNREACH;
/**
* Connection reset by network.
*/
extern const errno_t ENETRESET;
/**
* Connection reset before accept.
*/
extern const errno_t ECONNABORTED;
/**
* Connection reset by client.
*/
extern const errno_t ECONNRESET;
/**
* No buffer space available.
*/
extern const errno_t ENOBUFS;
/**
* Socket is connected.
*/
extern const errno_t EISCONN;
/**
* Socket is not connected.
*/
extern const errno_t ENOTCONN;
/**
* Cannot send after transport endpoint shutdown.
*/
extern const errno_t ESHUTDOWN;
/**
* Too many references: cannot splice.
*/
extern const errno_t ETOOMANYREFS;
/**
* Connection timed out.
*/
extern const errno_t ETIMEDOUT;
/**
* Connection refused error.
*/
extern const errno_t ECONNREFUSED;
/**
* Host down error.
*/
extern const errno_t EHOSTDOWN;
/**
* Host unreachable error.
*/
extern const errno_t EHOSTUNREACH;
/**
* Connection already in progress.
*/
extern const errno_t EALREADY;
/**
* Operation already in progress.
*/
extern const errno_t EINPROGRESS;
/**
* Stale error.
*/
extern const errno_t ESTALE;
/**
* Remote error.
*/
extern const errno_t EREMOTE;
/**
* Bad message.
*/
extern const errno_t EBADMSG;
/**
* Operation canceled.
*/
extern const errno_t ECANCELED;
/**
* Owner died.
*/
extern const errno_t EOWNERDEAD;
/**
* State not recoverable.
*/
extern const errno_t ENOTRECOVERABLE;
/**
* No network.
*/
extern const errno_t ENONET;
/**
* Please restart syscall.
*/
extern const errno_t ERESTART;
/**
* Out of streams resources.
*/
extern const errno_t ENOSR;
/**
* No string.
*/
extern const errno_t ENOSTR;
/**
* No data.
*/
extern const errno_t ENODATA;
/**
* Multihop attempted.
*/
extern const errno_t EMULTIHOP;
/**
* Link severed.
*/
extern const errno_t ENOLINK;
/**
* No medium found.
*/
extern const errno_t ENOMEDIUM;
/**
* Wrong medium type.
*/
extern const errno_t EMEDIUMTYPE;
/**
* Inappropriate file type or format.
*/
extern const errno_t EFTYPE;
extern const errno_t EAUTH;
extern const errno_t EBADARCH;
extern const errno_t EBADEXEC;
extern const errno_t EBADMACHO;
extern const errno_t EBADRPC;
extern const errno_t EDEVERR;
extern const errno_t ENEEDAUTH;
extern const errno_t ENOATTR;
extern const errno_t ENOPOLICY;
extern const errno_t EPROCLIM;
extern const errno_t EPROCUNAVAIL;
extern const errno_t EPROGMISMATCH;
extern const errno_t EPROGUNAVAIL;
extern const errno_t EPWROFF;
extern const errno_t ERPCMISMATCH;
extern const errno_t ESHLIBVERS;
extern const errno_t EADV;
extern const errno_t EBADE;
extern const errno_t EBADFD;
extern const errno_t EBADR;
extern const errno_t EBADRQC;
extern const errno_t EBADSLT;
extern const errno_t ECHRNG;
extern const errno_t ECOMM;
extern const errno_t EDOTDOT;
extern const errno_t EHWPOISON;
extern const errno_t EISNAM;
extern const errno_t EKEYEXPIRED;
extern const errno_t EKEYREJECTED;
extern const errno_t EKEYREVOKED;
extern const errno_t EL2HLT;
extern const errno_t EL2NSYNC;
extern const errno_t EL3HLT;
extern const errno_t EL3RST;
extern const errno_t ELIBACC;
extern const errno_t ELIBBAD;
extern const errno_t ELIBEXEC;
extern const errno_t ELIBMAX;
extern const errno_t ELIBSCN;
extern const errno_t ELNRNG;
extern const errno_t ENAVAIL;
extern const errno_t ENOANO;
extern const errno_t ENOCSI;
extern const errno_t ENOKEY;
extern const errno_t ENOPKG;
extern const errno_t ENOTNAM;
extern const errno_t ENOTUNIQ;
extern const errno_t EREMCHG;
extern const errno_t EREMOTEIO;
extern const errno_t ERFKILL;
extern const errno_t ESRMNT;
extern const errno_t ESTRPIPE;
extern const errno_t EUCLEAN;
extern const errno_t EUNATCH;
extern const errno_t EXFULL;
#define E2BIG E2BIG
#define EACCES EACCES
#define EADDRINUSE EADDRINUSE
#define EADDRNOTAVAIL EADDRNOTAVAIL
#define EAFNOSUPPORT EAFNOSUPPORT
#define EAGAIN EAGAIN
#define EALREADY EALREADY
#define EBADF EBADF
#define EBADMSG EBADMSG
#define EBUSY EBUSY
#define ECANCELED ECANCELED
#define ECHILD ECHILD
#define ECONNABORTED ECONNABORTED
#define ECONNREFUSED ECONNREFUSED
#define ECONNRESET ECONNRESET
#define EDEADLK EDEADLK
#define EDESTADDRREQ EDESTADDRREQ
#define EDOM EDOM
#define EDQUOT EDQUOT
#define EEXIST EEXIST
#define EFAULT EFAULT
#define EFBIG EFBIG
#define EFTYPE EFTYPE
#define EHOSTDOWN EHOSTDOWN
#define EHOSTUNREACH EHOSTUNREACH
#define EIDRM EIDRM
#define EILSEQ EILSEQ
#define EINPROGRESS EINPROGRESS
#define EINTR EINTR
#define EINVAL EINVAL
#define EIO EIO
#define EISCONN EISCONN
#define EISDIR EISDIR
#define ELOOP ELOOP
#define EMEDIUMTYPE EMEDIUMTYPE
#define EMFILE EMFILE
#define EMLINK EMLINK
#define EMSGSIZE EMSGSIZE
#define EMULTIHOP EMULTIHOP
#define ENAMETOOLONG ENAMETOOLONG
#define ENETDOWN ENETDOWN
#define ENETRESET ENETRESET
#define ENETUNREACH ENETUNREACH
#define ENFILE ENFILE
#define ENOBUFS ENOBUFS
#define ENODATA ENODATA
#define ENODEV ENODEV
#define ENOENT ENOENT
#define ENOEXEC ENOEXEC
#define ENOLCK ENOLCK
#define ENOLINK ENOLINK
#define ENOMEDIUM ENOMEDIUM
#define ENOMEM ENOMEM
#define ENOMSG ENOMSG
#define ENONET ENONET
#define ENOPROTOOPT ENOPROTOOPT
#define ENOSPC ENOSPC
#define ENOSR ENOSR
#define ENOSTR ENOSTR
#define ENOSYS ENOSYS
#define ENOTBLK ENOTBLK
#define ENOTCONN ENOTCONN
#define ENOTDIR ENOTDIR
#define ENOTEMPTY ENOTEMPTY
#define ENOTRECOVERABLE ENOTRECOVERABLE
#define ENOTSOCK ENOTSOCK
#define ENOTSUP ENOTSUP
#define ENOTTY ENOTTY
#define ENXIO ENXIO
#define EOPNOTSUPP EOPNOTSUPP
#define EOVERFLOW EOVERFLOW
#define EOWNERDEAD EOWNERDEAD
#define EPERM EPERM
#define EPFNOSUPPORT EPFNOSUPPORT
#define EPIPE EPIPE
#define EPROTO EPROTO
#define EPROTONOSUPPORT EPROTONOSUPPORT
#define EPROTOTYPE EPROTOTYPE
#define ERANGE ERANGE
#define EREMOTE EREMOTE
#define ERESTART ERESTART
#define EROFS EROFS
#define ESHUTDOWN ESHUTDOWN
#define ESOCKTNOSUPPORT ESOCKTNOSUPPORT
#define ESPIPE ESPIPE
#define ESRCH ESRCH
#define ESTALE ESTALE
#define ETIME ETIME
#define ETIMEDOUT ETIMEDOUT
#define ETOOMANYREFS ETOOMANYREFS
#define ETXTBSY ETXTBSY
#define EUSERS EUSERS
#define EWOULDBLOCK EAGAIN
#define EXDEV EXDEV
extern errno_t __errno;
errno_t *__errno_location(void) dontthrow pureconst;
#if defined(_COSMO_SOURCE) || defined(_GNU_SOURCE)
extern char *program_invocation_short_name;
extern char *program_invocation_name;
#endif
COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_ERRNO_H_ */