481 lines
9.9 KiB
C
481 lines
9.9 KiB
C
/// MentOS, The Mentoring Operating system project
|
|
/// @file strerror.c
|
|
/// @brief
|
|
/// @copyright (c) 2014-2021 This file is distributed under the MIT License.
|
|
/// See LICENSE.md for details.
|
|
|
|
#include "strerror.h"
|
|
#include "string.h"
|
|
|
|
char *strerror(int errnum)
|
|
{
|
|
static char error[1024];
|
|
|
|
switch (errnum) {
|
|
case 0:
|
|
strcpy(error, "Success");
|
|
break;
|
|
#ifdef ENOENT
|
|
case ENOENT:
|
|
strcpy(error, "No such file or directory");
|
|
break;
|
|
#endif
|
|
#ifdef ESRCH
|
|
case ESRCH:
|
|
strcpy(error, "No such process");
|
|
break;
|
|
#endif
|
|
#ifdef EINTR
|
|
case EINTR:
|
|
strcpy(error, "Interrupted system call");
|
|
break;
|
|
#endif
|
|
#ifdef EIO
|
|
case EIO:
|
|
strcpy(error, "I/O error");
|
|
break;
|
|
#endif
|
|
#if defined(ENXIO) && (!defined(ENODEV) || (ENXIO != ENODEV))
|
|
case ENXIO:
|
|
strcpy(error, "No such device or address");
|
|
break;
|
|
#endif
|
|
#ifdef E2BIG
|
|
case E2BIG:
|
|
strcpy(error, "Arg list too long");
|
|
break;
|
|
#endif
|
|
#ifdef ENOEXEC
|
|
case ENOEXEC:
|
|
strcpy(error, "Exec format error");
|
|
break;
|
|
#endif
|
|
#ifdef EALREADY
|
|
case EALREADY:
|
|
strcpy(error, "Socket already connected");
|
|
break;
|
|
#endif
|
|
#ifdef EBADF
|
|
case EBADF:
|
|
strcpy(error, "Bad file number");
|
|
break;
|
|
#endif
|
|
#ifdef ECHILD
|
|
case ECHILD:
|
|
strcpy(error, "No children");
|
|
break;
|
|
#endif
|
|
#ifdef EDESTADDRREQ
|
|
case EDESTADDRREQ:
|
|
strcpy(error, "Destination address required");
|
|
break;
|
|
#endif
|
|
#ifdef EAGAIN
|
|
case EAGAIN:
|
|
strcpy(error, "No more processes");
|
|
break;
|
|
#endif
|
|
#ifdef ENOMEM
|
|
case ENOMEM:
|
|
strcpy(error, "Not enough space");
|
|
break;
|
|
#endif
|
|
#ifdef EACCES
|
|
case EACCES:
|
|
strcpy(error, "Permission denied");
|
|
break;
|
|
#endif
|
|
#ifdef EFAULT
|
|
case EFAULT:
|
|
strcpy(error, "Bad address");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTBLK
|
|
case ENOTBLK:
|
|
strcpy(error, "Block device required");
|
|
break;
|
|
#endif
|
|
#ifdef EBUSY
|
|
case EBUSY:
|
|
strcpy(error, "Device or resource busy");
|
|
break;
|
|
#endif
|
|
#ifdef EEXIST
|
|
case EEXIST:
|
|
strcpy(error, "File exists");
|
|
break;
|
|
#endif
|
|
#ifdef EXDEV
|
|
case EXDEV:
|
|
strcpy(error, "Cross-device link");
|
|
break;
|
|
#endif
|
|
#ifdef ENODEV
|
|
case ENODEV:
|
|
strcpy(error, "No such device");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTDIR
|
|
case ENOTDIR:
|
|
strcpy(error, "Not a directory");
|
|
break;
|
|
#endif
|
|
#ifdef EHOSTDOWN
|
|
case EHOSTDOWN:
|
|
strcpy(error, "Host is down");
|
|
break;
|
|
#endif
|
|
#ifdef EINPROGRESS
|
|
case EINPROGRESS:
|
|
strcpy(error, "Connection already in progress");
|
|
break;
|
|
#endif
|
|
#ifdef EISDIR
|
|
case EISDIR:
|
|
strcpy(error, "Is a directory");
|
|
break;
|
|
#endif
|
|
#ifdef EINVAL
|
|
case EINVAL:
|
|
strcpy(error, "Invalid argument");
|
|
break;
|
|
#endif
|
|
#ifdef EISNAM
|
|
case EISNAM:
|
|
strcpy(error, "Is a named type file");
|
|
break;
|
|
#endif
|
|
#ifdef ENETDOWN
|
|
case ENETDOWN:
|
|
strcpy(error, "Network interface is not configured");
|
|
break;
|
|
#endif
|
|
#ifdef ENFILE
|
|
case ENFILE:
|
|
strcpy(error, "Too many open files in system");
|
|
break;
|
|
#endif
|
|
#ifdef EMFILE
|
|
case EMFILE:
|
|
strcpy(error, "Too many open files");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTTY
|
|
case ENOTTY:
|
|
strcpy(error, "Not a character device");
|
|
break;
|
|
#endif
|
|
#ifdef ETXTBSY
|
|
case ETXTBSY:
|
|
strcpy(error, "Text file busy");
|
|
break;
|
|
#endif
|
|
#ifdef EFBIG
|
|
case EFBIG:
|
|
strcpy(error, "File too large");
|
|
break;
|
|
#endif
|
|
#ifdef EHOSTUNREACH
|
|
case EHOSTUNREACH:
|
|
strcpy(error, "Host is unreachable");
|
|
break;
|
|
#endif
|
|
#ifdef ENOSPC
|
|
case ENOSPC:
|
|
strcpy(error, "No space left on device");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTSUP
|
|
case ENOTSUP:
|
|
strcpy(error, "Not supported");
|
|
break;
|
|
#endif
|
|
#ifdef ESPIPE
|
|
case ESPIPE:
|
|
strcpy(error, "Illegal seek");
|
|
break;
|
|
#endif
|
|
#ifdef EROFS
|
|
case EROFS:
|
|
strcpy(error, "Read-only file system");
|
|
break;
|
|
#endif
|
|
#ifdef EMLINK
|
|
case EMLINK:
|
|
strcpy(error, "Too many links");
|
|
break;
|
|
#endif
|
|
#ifdef EPIPE
|
|
case EPIPE:
|
|
strcpy(error, "Broken pipe");
|
|
break;
|
|
#endif
|
|
#ifdef EDOM
|
|
case EDOM:
|
|
strcpy(error, "Math argument");
|
|
break;
|
|
#endif
|
|
#ifdef ERANGE
|
|
case ERANGE:
|
|
strcpy(error, "Result too large");
|
|
break;
|
|
#endif
|
|
#ifdef ENOMSG
|
|
case ENOMSG:
|
|
strcpy(error, "No message of desired type");
|
|
break;
|
|
#endif
|
|
#ifdef EIDRM
|
|
case EIDRM:
|
|
strcpy(error, "Identifier removed");
|
|
break;
|
|
#endif
|
|
#ifdef EDEADLK
|
|
case EDEADLK:
|
|
strcpy(error, "Deadlock");
|
|
break;
|
|
#endif
|
|
#ifdef ENETUNREACH
|
|
case ENETUNREACH:
|
|
strcpy(error, "Network is unreachable");
|
|
break;
|
|
#endif
|
|
#ifdef ENOLCK
|
|
case ENOLCK:
|
|
strcpy(error, "No lock");
|
|
break;
|
|
#endif
|
|
#ifdef ENOSTR
|
|
case ENOSTR:
|
|
strcpy(error, "Not a stream");
|
|
break;
|
|
#endif
|
|
#ifdef ETIME
|
|
case ETIME:
|
|
strcpy(error, "Stream ioctl timeout");
|
|
break;
|
|
#endif
|
|
#ifdef ENOSR
|
|
case ENOSR:
|
|
strcpy(error, "No stream resources");
|
|
break;
|
|
#endif
|
|
#ifdef ENONET
|
|
case ENONET:
|
|
strcpy(error, "Machine is not on the network");
|
|
break;
|
|
#endif
|
|
#ifdef ENOPKG
|
|
case ENOPKG:
|
|
strcpy(error, "No package");
|
|
break;
|
|
#endif
|
|
#ifdef EREMOTE
|
|
case EREMOTE:
|
|
strcpy(error, "Resource is remote");
|
|
break;
|
|
#endif
|
|
#ifdef ENOLINK
|
|
case ENOLINK:
|
|
strcpy(error, "Virtual circuit is gone");
|
|
break;
|
|
#endif
|
|
#ifdef EADV
|
|
case EADV:
|
|
strcpy(error, "Advertise error");
|
|
break;
|
|
#endif
|
|
#ifdef ESRMNT
|
|
case ESRMNT:
|
|
strcpy(error, "Srmount error");
|
|
break;
|
|
#endif
|
|
#ifdef ECOMM
|
|
case ECOMM:
|
|
strcpy(error, "Communication error");
|
|
break;
|
|
#endif
|
|
#ifdef EPROTO
|
|
case EPROTO:
|
|
strcpy(error, "Protocol error");
|
|
break;
|
|
#endif
|
|
#ifdef EPROTONOSUPPORT
|
|
case EPROTONOSUPPORT:
|
|
strcpy(error, "Unknown protocol");
|
|
break;
|
|
#endif
|
|
#ifdef EMULTIHOP
|
|
case EMULTIHOP:
|
|
strcpy(error, "Multihop attempted");
|
|
break;
|
|
#endif
|
|
#ifdef EBADMSG
|
|
case EBADMSG:
|
|
strcpy(error, "Bad message");
|
|
break;
|
|
#endif
|
|
#ifdef ELIBACC
|
|
case ELIBACC:
|
|
strcpy(error, "Cannot access a needed shared library");
|
|
break;
|
|
#endif
|
|
#ifdef ELIBBAD
|
|
case ELIBBAD:
|
|
strcpy(error, "Accessing a corrupted shared library");
|
|
break;
|
|
#endif
|
|
#ifdef ELIBSCN
|
|
case ELIBSCN:
|
|
strcpy(error, ".lib section in a.out corrupted");
|
|
break;
|
|
#endif
|
|
#ifdef ELIBMAX
|
|
case ELIBMAX:
|
|
strcpy(error,
|
|
"Attempting to link in more shared libraries than system limit");
|
|
break;
|
|
#endif
|
|
#ifdef ELIBEXEC
|
|
case ELIBEXEC:
|
|
strcpy(error, "Cannot exec a shared library directly");
|
|
break;
|
|
#endif
|
|
#ifdef ENOSYS
|
|
case ENOSYS:
|
|
strcpy(error, "Function not implemented");
|
|
break;
|
|
#endif
|
|
#ifdef ENMFILE
|
|
case ENMFILE:
|
|
strcpy(error, "No more files");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTEMPTY
|
|
case ENOTEMPTY:
|
|
strcpy(error, "Directory not empty");
|
|
break;
|
|
#endif
|
|
#ifdef ENAMETOOLONG
|
|
case ENAMETOOLONG:
|
|
strcpy(error, "File or path name too long");
|
|
break;
|
|
#endif
|
|
#ifdef ELOOP
|
|
case ELOOP:
|
|
strcpy(error, "Too many symbolic links");
|
|
break;
|
|
#endif
|
|
#ifdef ENOBUFS
|
|
case ENOBUFS:
|
|
strcpy(error, "No buffer space available");
|
|
break;
|
|
#endif
|
|
#ifdef EAFNOSUPPORT
|
|
case EAFNOSUPPORT:
|
|
strcpy(error, "Address family not supported by protocol family");
|
|
break;
|
|
#endif
|
|
#ifdef EPROTOTYPE
|
|
case EPROTOTYPE:
|
|
strcpy(error, "Protocol wrong type for socket");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTSOCK
|
|
case ENOTSOCK:
|
|
strcpy(error, "Socket operation on non-socket");
|
|
break;
|
|
#endif
|
|
#ifdef ENOPROTOOPT
|
|
case ENOPROTOOPT:
|
|
strcpy(error, "Protocol not available");
|
|
break;
|
|
#endif
|
|
#ifdef ESHUTDOWN
|
|
case ESHUTDOWN:
|
|
strcpy(error, "Can't send after socket shutdown");
|
|
break;
|
|
#endif
|
|
#ifdef ECONNREFUSED
|
|
case ECONNREFUSED:
|
|
strcpy(error, "Connection refused");
|
|
break;
|
|
#endif
|
|
#ifdef EADDRINUSE
|
|
case EADDRINUSE:
|
|
strcpy(error, "Address already in use");
|
|
break;
|
|
#endif
|
|
#ifdef ECONNABORTED
|
|
case ECONNABORTED:
|
|
strcpy(error, "Software caused connection abort");
|
|
break;
|
|
#endif
|
|
#if (defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)))
|
|
case EWOULDBLOCK:
|
|
strcpy(error, "Operation would block");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTCONN
|
|
case ENOTCONN:
|
|
strcpy(error, "Socket is not connected");
|
|
break;
|
|
#endif
|
|
#ifdef ESOCKTNOSUPPORT
|
|
case ESOCKTNOSUPPORT:
|
|
strcpy(error, "Socket type not supported");
|
|
break;
|
|
#endif
|
|
#ifdef EISCONN
|
|
case EISCONN:
|
|
strcpy(error, "Socket is already connected");
|
|
break;
|
|
#endif
|
|
#ifdef ECANCELED
|
|
case ECANCELED:
|
|
strcpy(error, "Operation canceled");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTRECOVERABLE
|
|
case ENOTRECOVERABLE:
|
|
strcpy(error, "State not recoverable");
|
|
break;
|
|
#endif
|
|
#ifdef EOWNERDEAD
|
|
case EOWNERDEAD:
|
|
strcpy(error, "Previous owner died");
|
|
break;
|
|
#endif
|
|
#ifdef ESTRPIPE
|
|
case ESTRPIPE:
|
|
strcpy(error, "Streams pipe error");
|
|
break;
|
|
#endif
|
|
#if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP))
|
|
case EOPNOTSUPP:
|
|
strcpy(error, "Operation not supported on socket");
|
|
break;
|
|
#endif
|
|
#ifdef EMSGSIZE
|
|
case EMSGSIZE:
|
|
strcpy(error, "Message too long");
|
|
break;
|
|
#endif
|
|
#ifdef ETIMEDOUT
|
|
case ETIMEDOUT:
|
|
strcpy(error, "Connection timed out");
|
|
break;
|
|
#endif
|
|
#ifdef ENOTSCHEDULABLE
|
|
case ENOTSCHEDULABLE:
|
|
strcpy(error, "The process cannot be scheduled");
|
|
break;
|
|
#endif
|
|
default:
|
|
strcpy(error, "Unknown error");
|
|
break;
|
|
}
|
|
|
|
return error;
|
|
}
|