5abc9b830b
* cygwin.din: Eliminate _strace_wm. * sigproc.cc (wait_sig): Temporarily add more debugging output. * include/cygwin/version.h: Bump minor api to reflect export change.
670 lines
18 KiB
C++
670 lines
18 KiB
C++
/* errno.cc: errno-related functions
|
|
|
|
Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#define _REENT_ONLY
|
|
#include <stdio.h>
|
|
#include "winsup.h"
|
|
#include <errno.h>
|
|
|
|
/* Table to map Windows error codes to Errno values. */
|
|
/* FIXME: Doing things this way is a little slow. It's trivial to change
|
|
this into a big case statement if necessary. Left as is for now. */
|
|
|
|
#define X(w, e) {ERROR_##w, #w, e}
|
|
|
|
static const struct
|
|
{
|
|
int w; /* windows version of error */
|
|
const char *s; /* text of windows version */
|
|
int e; /* errno version of error */
|
|
}
|
|
errmap[] =
|
|
{
|
|
/* FIXME: Some of these choices are arbitrary! */
|
|
X (INVALID_FUNCTION, EBADRQC),
|
|
X (FILE_NOT_FOUND, ENOENT),
|
|
X (PATH_NOT_FOUND, ENOENT),
|
|
X (TOO_MANY_OPEN_FILES, EMFILE),
|
|
X (ACCESS_DENIED, EACCES),
|
|
X (INVALID_HANDLE, EBADF),
|
|
X (NOT_ENOUGH_MEMORY, ENOMEM),
|
|
X (INVALID_DATA, EINVAL),
|
|
X (OUTOFMEMORY, ENOMEM),
|
|
X (INVALID_DRIVE, ENODEV),
|
|
X (NOT_SAME_DEVICE, EXDEV),
|
|
X (NO_MORE_FILES, ENMFILE),
|
|
X (WRITE_PROTECT, EROFS),
|
|
X (BAD_UNIT, ENODEV),
|
|
X (SHARING_VIOLATION, EACCES),
|
|
X (LOCK_VIOLATION, EACCES),
|
|
X (SHARING_BUFFER_EXCEEDED, ENOLCK),
|
|
X (HANDLE_EOF, ENODATA),
|
|
X (HANDLE_DISK_FULL, ENOSPC),
|
|
X (NOT_SUPPORTED, ENOSYS),
|
|
X (REM_NOT_LIST, ENONET),
|
|
X (DUP_NAME, ENOTUNIQ),
|
|
X (BAD_NETPATH, ENXIO),
|
|
X (FILE_EXISTS, EEXIST),
|
|
X (CANNOT_MAKE, EPERM),
|
|
X (INVALID_PARAMETER, EINVAL),
|
|
X (NO_PROC_SLOTS, EAGAIN),
|
|
X (BROKEN_PIPE, EPIPE),
|
|
X (OPEN_FAILED, EIO),
|
|
X (NO_MORE_SEARCH_HANDLES, ENFILE),
|
|
X (CALL_NOT_IMPLEMENTED, ENOSYS),
|
|
X (INVALID_NAME, ENOENT),
|
|
X (WAIT_NO_CHILDREN, ECHILD),
|
|
X (CHILD_NOT_COMPLETE, EBUSY),
|
|
X (DIR_NOT_EMPTY, ENOTEMPTY),
|
|
X (SIGNAL_REFUSED, EIO),
|
|
X (BAD_PATHNAME, EINVAL),
|
|
X (SIGNAL_PENDING, EBUSY),
|
|
X (MAX_THRDS_REACHED, EAGAIN),
|
|
X (BUSY, EBUSY),
|
|
X (ALREADY_EXISTS, EEXIST),
|
|
X (NO_SIGNAL_SENT, EIO),
|
|
X (FILENAME_EXCED_RANGE, EINVAL),
|
|
X (META_EXPANSION_TOO_LONG, EINVAL),
|
|
X (INVALID_SIGNAL_NUMBER, EINVAL),
|
|
X (THREAD_1_INACTIVE, EINVAL),
|
|
X (BAD_PIPE, EINVAL),
|
|
X (PIPE_BUSY, EBUSY),
|
|
X (NO_DATA, EPIPE),
|
|
X (PIPE_NOT_CONNECTED, ECOMM),
|
|
X (MORE_DATA, EAGAIN),
|
|
X (DIRECTORY, EISDIR),
|
|
X (PIPE_CONNECTED, EBUSY),
|
|
X (PIPE_LISTENING, ECOMM),
|
|
X (NO_TOKEN, EINVAL),
|
|
X (PROCESS_ABORTED, EFAULT),
|
|
X (BAD_DEVICE, ENODEV),
|
|
X (BAD_USERNAME, EINVAL),
|
|
X (NOT_CONNECTED, ENOLINK),
|
|
X (OPEN_FILES, EAGAIN),
|
|
X (ACTIVE_CONNECTIONS, EAGAIN),
|
|
X (DEVICE_IN_USE, EAGAIN),
|
|
X (INVALID_AT_INTERRUPT_TIME, EINTR),
|
|
X (IO_DEVICE, EIO),
|
|
X (NOT_OWNER, EPERM),
|
|
X (END_OF_MEDIA, ENOSPC),
|
|
X (EOM_OVERFLOW, ENOSPC),
|
|
X (BEGINNING_OF_MEDIA, ESPIPE),
|
|
X (SETMARK_DETECTED, ESPIPE),
|
|
X (NO_DATA_DETECTED, ENOSPC),
|
|
X (POSSIBLE_DEADLOCK, EDEADLOCK),
|
|
X (CRC, EIO),
|
|
X (NEGATIVE_SEEK, EINVAL),
|
|
X (NOT_READY, ENOMEDIUM),
|
|
X (DISK_FULL, ENOSPC),
|
|
{ 0, NULL, 0}
|
|
};
|
|
|
|
/* seterrno_from_win_error: Given a Windows error code, set errno
|
|
as appropriate. */
|
|
void
|
|
seterrno_from_win_error (const char *file, int line, int code)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; errmap[i].w != 0; ++i)
|
|
if (code == errmap[i].w)
|
|
break;
|
|
|
|
if (errmap[i].w != 0)
|
|
{
|
|
if (strace.active)
|
|
strace.prntf (_STRACE_SYSCALL, "%s:%d seterrno: %d (%s) -> %d",
|
|
file, line, code, errmap[i].s, errmap[i].e);
|
|
set_errno (errmap[i].e);
|
|
}
|
|
else
|
|
{
|
|
if (strace.active)
|
|
strace.prntf (_STRACE_SYSCALL, "%s:%d seterrno: unknown error %d", file, line, code);
|
|
set_errno (EACCES);
|
|
}
|
|
}
|
|
|
|
/* seterrno: Set `errno' based on GetLastError (). */
|
|
void
|
|
seterrno (const char *file, int line)
|
|
{
|
|
seterrno_from_win_error (file, line, GetLastError ());
|
|
}
|
|
|
|
extern char *_user_strerror _PARAMS ((int));
|
|
|
|
extern const char __declspec(dllexport) * const _sys_errlist[]=
|
|
{
|
|
/* NOERROR 0 */ "No error",
|
|
/* EPERM 1 */ "Not super-user",
|
|
/* ENOENT 2 */ "No such file or directory",
|
|
/* ESRCH 3 */ "No such process",
|
|
/* EINTR 4 */ "Interrupted system call",
|
|
/* EIO 5 */ "I/O error",
|
|
/* ENXIO 6 */ "No such device or address",
|
|
/* E2BIG 7 */ "Arg list too long",
|
|
/* ENOEXEC 8 */ "Exec format error",
|
|
/* EBADF 9 */ "Bad file number",
|
|
/* ECHILD 10 */ "No children",
|
|
/* EAGAIN 11 */ "Resource temporarily unavailable",
|
|
/* ENOMEM 12 */ "Not enough core",
|
|
/* EACCES 13 */ "Permission denied",
|
|
/* EFAULT 14 */ "Bad address",
|
|
/* ENOTBLK 15 */ "Block device required",
|
|
/* EBUSY 16 */ "Mount device busy",
|
|
/* EEXIST 17 */ "File exists",
|
|
/* EXDEV 18 */ "Cross-device link",
|
|
/* ENODEV 19 */ "No such device",
|
|
/* ENOTDIR 20 */ "Not a directory",
|
|
/* EISDIR 21 */ "Is a directory",
|
|
/* EINVAL 22 */ "Invalid argument",
|
|
/* ENFILE 23 */ "Too many open files in system",
|
|
/* EMFILE 24 */ "Too many open files",
|
|
/* ENOTTY 25 */ "Not a typewriter",
|
|
/* ETXTBSY 26 */ "Text file busy",
|
|
/* EFBIG 27 */ "File too large",
|
|
/* ENOSPC 28 */ "No space left on device",
|
|
/* ESPIPE 29 */ "Illegal seek",
|
|
/* EROFS 30 */ "Read only file system",
|
|
/* EMLINK 31 */ "Too many links",
|
|
/* EPIPE 32 */ "Broken pipe",
|
|
/* EDOM 33 */ "Math arg out of domain of func",
|
|
/* ERANGE 34 */ "Math result not representable",
|
|
/* ENOMSG 35 */ "No message of desired type",
|
|
/* EIDRM 36 */ "Identifier removed",
|
|
/* ECHRNG 37 */ "Channel number out of range",
|
|
/* EL2NSYNC 38 */ "Level 2 not synchronized",
|
|
/* EL3HLT 39 */ "Level 3 halted",
|
|
/* EL3RST 40 */ "Level 3 reset",
|
|
/* ELNRNG 41 */ "Link number out of range",
|
|
/* EUNATCH 42 */ "Protocol driver not attached",
|
|
/* ENOCSI 43 */ "No CSI structure available",
|
|
/* EL2HLT 44 */ "Level 2 halted",
|
|
/* EDEADLK 45 */ "Deadlock condition",
|
|
/* ENOLCK 46 */ "No record locks available",
|
|
"47",
|
|
"48",
|
|
"49",
|
|
/* EBADE 50 */ "Invalid exchange",
|
|
/* EBADR 51 */ "Invalid request descriptor",
|
|
/* EXFULL 52 */ "Exchange full",
|
|
/* ENOANO 53 */ "No anode",
|
|
/* EBADRQC 54 */ "Invalid request code",
|
|
/* EBADSLT 55 */ "Invalid slot",
|
|
/* EDEADLOCK 56 */ "File locking deadlock error",
|
|
/* EBFONT 57 */ "Bad font file fmt",
|
|
"58",
|
|
"59",
|
|
/* ENOSTR 60 */ "Device not a stream",
|
|
/* ENODATA 61 */ "No data (for no delay io)",
|
|
/* 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 */ "The object is remote",
|
|
/* ENOLINK 67 */ "The link has been severed",
|
|
/* EADV 68 */ "Advertise error",
|
|
/* ESRMNT 69 */ "Srmount error",
|
|
/* ECOMM 70 */ "Communication error on send",
|
|
/* EPROTO 71 */ "Protocol error",
|
|
"72",
|
|
"73",
|
|
/* EMULTIHOP 74 */ "Multihop attempted",
|
|
/* ELBIN 75 */ "Inode is remote (not really error)",
|
|
/* EDOTDOT 76 */ "Cross mount point (not really error)",
|
|
/* EBADMSG 77 */ "Trying to read unreadable message",
|
|
"78",
|
|
"79",
|
|
/* ENOTUNIQ 80 */ "Given log. name not unique",
|
|
/* EBADFD 81 */ "f.d. invalid for this operation",
|
|
/* EREMCHG 82 */ "Remote address changed",
|
|
/* ELIBACC 83 */ "Can't access a needed shared lib",
|
|
/* ELIBBAD 84 */ "Accessing a corrupted shared lib",
|
|
/* ELIBSCN 85 */ ".lib section in a.out corrupted",
|
|
/* ELIBMAX 86 */ "Attempting to link in too many libs",
|
|
/* ELIBEXEC 87 */ "Attempting to exec a shared library",
|
|
/* ENOSYS 88 */ "Function not implemented",
|
|
/* ENMFILE 89 */ "No more files",
|
|
/* ENOTEMPTY 90 */ "Directory not empty",
|
|
/* ENAMETOOLONG 91 */ "File or path name too long",
|
|
/* ELOOP 92 */ "Too many symbolic links",
|
|
"93",
|
|
"94",
|
|
/* EOPNOTSUPP 95 */ "Operation not supported on transport endpoint",
|
|
/* EPFNOSUPPORT 96 */ "Protocol family not supported",
|
|
"97",
|
|
"98",
|
|
"99",
|
|
"100",
|
|
"101",
|
|
"102",
|
|
"103",
|
|
/* ECONNRESET 104 */ "Connection reset by peer",
|
|
/* ENOBUFS 105 */ "No buffer space available",
|
|
/* EAFNOSUPPORT 106 */ "Address family not supported by protocol",
|
|
/* EPROTOTYPE 107 */ "Protocol wrong type for transport endpoint",
|
|
/* ENOTSOCK 108 */ "Socket operation on non-socket"
|
|
/* ENOPROTOOPT 109 */ "Protocol not available",
|
|
/* ESHUTDOWN 110 */ "Cannot send after transport endpoint shutdown",
|
|
/* ECONNREFUSED 111 */ "Connection refused",
|
|
/* EADDRINUSE 112 */ "Address already in use"
|
|
/* ECONNABORTED 113 */ "Connection aborted",
|
|
/* ENETUNREACH 114 */ "Network is unreachable",
|
|
/* ENETDOWN 115 */ "Network is down",
|
|
/* ETIMEDOUT 116 */ "Connection timed out",
|
|
/* EHOSTDOWN 117 */ "Host is down",
|
|
/* EHOSTUNREACH 118 */ "No route to host",
|
|
/* EINPROGRESS 119 */ "Operation now in progress",
|
|
/* EALREADY 120 */ "Operation already in progress",
|
|
/* EDESTADDRREQ 121 */ "Destination address required",
|
|
/* EMSGSIZE 122 */ "Message too long",
|
|
/* EPROTONOSUPPORT 123 */ "Protocol not supported",
|
|
/* ESOCKTNOSUPPORT 124 */ "Socket type not supported",
|
|
/* EADDRNOTAVAIL 125 */ "Cannot assign requested address",
|
|
/* ENETRESET 126 */ "Network dropped connection because of reset",
|
|
/* EISCONN 127 */ "Transport endpoint is already connected",
|
|
/* ENOTCONN 128 */ "Transport endpoint is not connected",
|
|
/* ETOOMANYREFS 129 */ "Too many references: cannot splice",
|
|
/* EPROCLIM 130 */ "Process limit exceeded",
|
|
/* EUSERS 131 */ "Too many users",
|
|
/* EDQUOT 132 */ "Quota exceeded",
|
|
/* ESTALE 133 */ "Stale NFS file handle",
|
|
/* ENOTSUP 134 */ "134",
|
|
/* ENOMEDIUM 135 */ "no medium"
|
|
};
|
|
|
|
int __declspec(dllexport) _sys_nerr =
|
|
sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
|
|
|
|
/* FIXME: Why is strerror() a long switch and not just:
|
|
return sys_errlist[errnum];
|
|
(or moral equivalent).
|
|
Some entries in sys_errlist[] don't match the corresponding
|
|
entries in strerror(). This seems odd.
|
|
*/
|
|
|
|
/* CYGWIN internal */
|
|
/* strerror: convert from errno values to error strings */
|
|
extern "C" char *
|
|
strerror (int errnum)
|
|
{
|
|
const char *error;
|
|
switch (errnum)
|
|
{
|
|
case EPERM:
|
|
error = "Not owner";
|
|
break;
|
|
case ENOENT:
|
|
error = "No such file or directory";
|
|
break;
|
|
case ESRCH:
|
|
error = "No such process";
|
|
break;
|
|
case EINTR:
|
|
error = "Interrupted system call";
|
|
break;
|
|
case EIO:
|
|
error = "I/O error";
|
|
break;
|
|
case ENXIO:
|
|
error = "No such device or address";
|
|
break;
|
|
case E2BIG:
|
|
error = "Arg list too long";
|
|
break;
|
|
case ENOEXEC:
|
|
error = "Exec format error";
|
|
break;
|
|
case EBADF:
|
|
error = "Bad file number";
|
|
break;
|
|
case ECHILD:
|
|
error = "No children";
|
|
break;
|
|
case EAGAIN:
|
|
error = "No more processes";
|
|
break;
|
|
case ENOMEM:
|
|
error = "Not enough memory";
|
|
break;
|
|
case EACCES:
|
|
error = "Permission denied";
|
|
break;
|
|
case EFAULT:
|
|
error = "Bad address";
|
|
break;
|
|
case ENOTBLK:
|
|
error = "Block device required";
|
|
break;
|
|
case EBUSY:
|
|
error = "Device or resource busy";
|
|
break;
|
|
case EEXIST:
|
|
error = "File exists";
|
|
break;
|
|
case EXDEV:
|
|
error = "Cross-device link";
|
|
break;
|
|
case ENODEV:
|
|
error = "No such device";
|
|
break;
|
|
case ENOTDIR:
|
|
error = "Not a directory";
|
|
break;
|
|
case EISDIR:
|
|
error = "Is a directory";
|
|
break;
|
|
case EINVAL:
|
|
error = "Invalid argument";
|
|
break;
|
|
case ENFILE:
|
|
error = "Too many open files in system";
|
|
break;
|
|
case EMFILE:
|
|
error = "Too many open files";
|
|
break;
|
|
case ENOTTY:
|
|
error = "Not a character device";
|
|
break;
|
|
case ETXTBSY:
|
|
error = "Text file busy";
|
|
break;
|
|
case EFBIG:
|
|
error = "File too large";
|
|
break;
|
|
case ENOSPC:
|
|
error = "No space left on device";
|
|
break;
|
|
case ESPIPE:
|
|
error = "Illegal seek";
|
|
break;
|
|
case EROFS:
|
|
error = "Read-only file system";
|
|
break;
|
|
case EMLINK:
|
|
error = "Too many links";
|
|
break;
|
|
case EPIPE:
|
|
error = "Broken pipe";
|
|
break;
|
|
case EDOM:
|
|
error = "Math arg out of domain of func";
|
|
break;
|
|
case ERANGE:
|
|
error = "Math result out of range";
|
|
break;
|
|
case ENOMSG:
|
|
error = "No message of desired type";
|
|
break;
|
|
case EIDRM:
|
|
error = "Identifier removed";
|
|
break;
|
|
case ECHRNG:
|
|
error = "Channel number out of range";
|
|
break;
|
|
case EL2NSYNC:
|
|
error = "Level 2 not synchronized";
|
|
break;
|
|
case EL3HLT:
|
|
error = "Level 3 halted";
|
|
break;
|
|
case EL3RST:
|
|
error = "Level 3 reset";
|
|
break;
|
|
case ELNRNG:
|
|
error = "Link number out of range";
|
|
break;
|
|
case EUNATCH:
|
|
error = "Protocol driver not attached";
|
|
break;
|
|
case ENOCSI:
|
|
error = "No CSI structure available";
|
|
break;
|
|
case EL2HLT:
|
|
error = "Level 2 halted";
|
|
break;
|
|
case EDEADLK:
|
|
error = "Deadlock condition";
|
|
break;
|
|
case ENOLCK:
|
|
error = "No lock";
|
|
break;
|
|
case EBADE:
|
|
error = "Invalid exchange";
|
|
break;
|
|
case EBADR:
|
|
error = "Invalid request descriptor";
|
|
break;
|
|
case EXFULL:
|
|
error = "Exchange full";
|
|
break;
|
|
case ENOANO:
|
|
error = "No anode";
|
|
break;
|
|
case EBADRQC:
|
|
error = "Invalid request code";
|
|
break;
|
|
case EBADSLT:
|
|
error = "Invalid slot";
|
|
break;
|
|
case EDEADLOCK:
|
|
error = "File locking deadlock error";
|
|
break;
|
|
case EBFONT:
|
|
error = "Bad font file fmt";
|
|
break;
|
|
case ENOSTR:
|
|
error = "Not a stream";
|
|
break;
|
|
case ENODATA:
|
|
error = "No data (for no delay io)";
|
|
break;
|
|
case ETIME:
|
|
error = "Stream ioctl timeout";
|
|
break;
|
|
case ENOSR:
|
|
error = "No stream resources";
|
|
break;
|
|
case ENONET:
|
|
error = "Machine is not on the network";
|
|
break;
|
|
case ENOPKG:
|
|
error = "No package";
|
|
break;
|
|
case EREMOTE:
|
|
error = "Resource is remote";
|
|
break;
|
|
case ENOLINK:
|
|
error = "Virtual circuit is gone";
|
|
break;
|
|
case EADV:
|
|
error = "Advertise error";
|
|
break;
|
|
case ESRMNT:
|
|
error = "Srmount error";
|
|
break;
|
|
case ECOMM:
|
|
error = "Communication error";
|
|
break;
|
|
case EPROTO:
|
|
error = "Protocol error";
|
|
break;
|
|
case EMULTIHOP:
|
|
error = "Multihop attempted";
|
|
break;
|
|
case ELBIN:
|
|
error = "Inode is remote (not really error)";
|
|
break;
|
|
case EDOTDOT:
|
|
error = "Cross mount point (not really error)";
|
|
break;
|
|
case EBADMSG:
|
|
error = "Bad message";
|
|
break;
|
|
case ENOTUNIQ:
|
|
error = "Given log. name not unique";
|
|
break;
|
|
case EBADFD:
|
|
error = "f.d. invalid for this operation";
|
|
break;
|
|
case EREMCHG:
|
|
error = "Remote address changed";
|
|
break;
|
|
case ELIBACC:
|
|
error = "Cannot access a needed shared library";
|
|
break;
|
|
case ELIBBAD:
|
|
error = "Accessing a corrupted shared library";
|
|
break;
|
|
case ELIBSCN:
|
|
error = ".lib section in a.out corrupted";
|
|
break;
|
|
case ELIBMAX:
|
|
error = "Attempting to link in more shared libraries than system limit";
|
|
break;
|
|
case ELIBEXEC:
|
|
error = "Cannot exec a shared library directly";
|
|
break;
|
|
case ENOSYS:
|
|
error = "Function not implemented";
|
|
break;
|
|
case ENMFILE:
|
|
error = "No more files";
|
|
break;
|
|
case ENOTEMPTY:
|
|
error = "Directory not empty";
|
|
break;
|
|
case ENAMETOOLONG:
|
|
error = "File or path name too long";
|
|
break;
|
|
case ELOOP:
|
|
error = "Too many symbolic links";
|
|
break;
|
|
case EOPNOTSUPP:
|
|
error = "Operation not supported on transport endpoint";
|
|
break;
|
|
case EPFNOSUPPORT:
|
|
error = "Protocol family not supported";
|
|
break;
|
|
case ECONNRESET:
|
|
error = "Connection reset by peer";
|
|
break;
|
|
case ENOBUFS:
|
|
error = "No buffer space available; the socket cannot be connected";
|
|
break;
|
|
case EAFNOSUPPORT:
|
|
error = "Addresses in the specified family cannot be used with this socket";
|
|
break;
|
|
case EPROTOTYPE:
|
|
error = "errno EPROTOTYPE triggered";
|
|
break;
|
|
case ENOTSOCK:
|
|
error = "The descriptor is a file, not a socket";
|
|
break;
|
|
case ENOPROTOOPT:
|
|
error = "This option is unsupported";
|
|
break;
|
|
case ESHUTDOWN:
|
|
error = "errno ESHUTDOWN triggered";
|
|
break;
|
|
case ECONNREFUSED:
|
|
error = "Connection refused";
|
|
break;
|
|
case EADDRINUSE:
|
|
error = "Address already in use";
|
|
break;
|
|
case ECONNABORTED:
|
|
error = "The connection was aborted";
|
|
break;
|
|
case ENETUNREACH:
|
|
error ="The network can't be reached from this host at this time";
|
|
break;
|
|
case ENETDOWN:
|
|
error = "Network failed.";
|
|
break;
|
|
case ETIMEDOUT:
|
|
error = "Attempt to connect timed out without establishing a connection";
|
|
break;
|
|
case EHOSTDOWN:
|
|
error = "errno EHOSTDOWN triggered";
|
|
break;
|
|
case EHOSTUNREACH:
|
|
error = "errno EHOSTUNREACH triggered";
|
|
break;
|
|
case EINPROGRESS:
|
|
error = "errno EINPROGRESS triggered";
|
|
break;
|
|
case EALREADY:
|
|
error = "errno EALREADY triggered";
|
|
break;
|
|
case EDESTADDRREQ:
|
|
error = "errno EDESTADDRREQ triggered";
|
|
break;
|
|
case EMSGSIZE:
|
|
error = "errno EMSGSIZE triggered";
|
|
break;
|
|
|
|
case EPROTONOSUPPORT:
|
|
error = "errno EPROTONOSUPPORT triggered";
|
|
break;
|
|
case ESOCKTNOSUPPORT:
|
|
error = "errno ESOCKTNOSUPPORT triggered";
|
|
break;
|
|
case EADDRNOTAVAIL:
|
|
error = "errno EADDRNOTAVAIL triggered";
|
|
break;
|
|
case ENETRESET:
|
|
error = "errno ENETRESET triggered";
|
|
break;
|
|
case EISCONN:
|
|
error = "The socket is already connected";
|
|
break;
|
|
case ENOTCONN:
|
|
error = "The socket is not connected";
|
|
break;
|
|
case ETOOMANYREFS:
|
|
error = "errno ETOOMANYREFS triggered";
|
|
break;
|
|
case EPROCLIM:
|
|
error = "errno EPROCLIM triggered";
|
|
break;
|
|
case EUSERS:
|
|
error = "errno EUSERS triggered";
|
|
break;
|
|
case EDQUOT:
|
|
error = "errno EDQUOT triggered";
|
|
break;
|
|
case ESTALE:
|
|
error = "errno ESTALE triggered";
|
|
break;
|
|
case ENOTSUP:
|
|
error = "errno ENOTSUP triggered";
|
|
break;
|
|
case ENOMEDIUM:
|
|
error = "no medium";
|
|
break;
|
|
default:
|
|
#ifdef _MT_SAFE
|
|
char *buf= _reent_winsup()->_strerror_buf;
|
|
#else
|
|
static NO_COPY char buf[20];
|
|
#endif
|
|
__small_sprintf (buf, "error %d", errnum);
|
|
error = buf;
|
|
break;
|
|
}
|
|
|
|
/* FIXME: strerror should really be const in the appropriate newlib
|
|
include files. */
|
|
return (char *) error;
|
|
}
|
|
|