diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
commit | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (patch) | |
tree | dc4fcf1e5e22a040716ef92c496b8d94959b2baa /winsup/cygwin/errno.cc | |
parent | 369d8a8fd5e887eca547bf34bccfdf755c9e5397 (diff) | |
download | newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.zip newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.gz newlib-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.bz2 |
import winsup-2000-02-17 snapshot
Diffstat (limited to 'winsup/cygwin/errno.cc')
-rw-r--r-- | winsup/cygwin/errno.cc | 669 |
1 files changed, 669 insertions, 0 deletions
diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc new file mode 100644 index 0000000..40e1616 --- /dev/null +++ b/winsup/cygwin/errno.cc @@ -0,0 +1,669 @@ +/* errno.cc: errno-related functions + + Copyright 1996, 1997, 1998, 1999 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_printf (_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_printf (_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; +} + |