#include "precompile.h" #include "toolkit.h" int toolkit_translate_sys_error(int sys_errno) { if (sys_errno <= 0) { return sys_errno; /* If < 0 then it's already a libuv error. */ } switch (sys_errno) { case ERROR_NOACCESS: return TOOLKIT_EACCES; case WSAEACCES: return TOOLKIT_EACCES; case ERROR_ELEVATION_REQUIRED: return TOOLKIT_EACCES; case ERROR_ADDRESS_ALREADY_ASSOCIATED: return TOOLKIT_EADDRINUSE; case WSAEADDRINUSE: return TOOLKIT_EADDRINUSE; case WSAEADDRNOTAVAIL: return TOOLKIT_EADDRNOTAVAIL; case WSAEAFNOSUPPORT: return TOOLKIT_EAFNOSUPPORT; case WSAEWOULDBLOCK: return TOOLKIT_EAGAIN; case WSAEALREADY: return TOOLKIT_EALREADY; case ERROR_INVALID_FLAGS: return TOOLKIT_EBADF; case ERROR_INVALID_HANDLE: return TOOLKIT_EBADF; case ERROR_LOCK_VIOLATION: return TOOLKIT_EBUSY; case ERROR_PIPE_BUSY: return TOOLKIT_EBUSY; case ERROR_SHARING_VIOLATION: return TOOLKIT_EBUSY; case ERROR_OPERATION_ABORTED: return TOOLKIT_ECANCELED; case WSAEINTR: return TOOLKIT_ECANCELED; case ERROR_NO_UNICODE_TRANSLATION: return TOOLKIT_ECHARSET; case ERROR_CONNECTION_ABORTED: return TOOLKIT_ECONNABORTED; case WSAECONNABORTED: return TOOLKIT_ECONNABORTED; case ERROR_CONNECTION_REFUSED: return TOOLKIT_ECONNREFUSED; case WSAECONNREFUSED: return TOOLKIT_ECONNREFUSED; case ERROR_NETNAME_DELETED: return TOOLKIT_ECONNRESET; case WSAECONNRESET: return TOOLKIT_ECONNRESET; case ERROR_ALREADY_EXISTS: return TOOLKIT_EEXIST; case ERROR_FILE_EXISTS: return TOOLKIT_EEXIST; case ERROR_BUFFER_OVERFLOW: return TOOLKIT_EFAULT; case WSAEFAULT: return TOOLKIT_EFAULT; case ERROR_HOST_UNREACHABLE: return TOOLKIT_EHOSTUNREACH; case WSAEHOSTUNREACH: return TOOLKIT_EHOSTUNREACH; case ERROR_INSUFFICIENT_BUFFER: return TOOLKIT_EINVAL; case ERROR_INVALID_DATA: return TOOLKIT_EINVAL; case ERROR_INVALID_PARAMETER: return TOOLKIT_EINVAL; case ERROR_SYMLINK_NOT_SUPPORTED: return TOOLKIT_EINVAL; case WSAEINVAL: return TOOLKIT_EINVAL; case WSAEPFNOSUPPORT: return TOOLKIT_EINVAL; case WSAESOCKTNOSUPPORT: return TOOLKIT_EINVAL; case ERROR_BEGINNING_OF_MEDIA: return TOOLKIT_EIO; case ERROR_BUS_RESET: return TOOLKIT_EIO; case ERROR_CRC: return TOOLKIT_EIO; case ERROR_DEVICE_DOOR_OPEN: return TOOLKIT_EIO; case ERROR_DEVICE_REQUIRES_CLEANING: return TOOLKIT_EIO; case ERROR_DISK_CORRUPT: return TOOLKIT_EIO; case ERROR_EOM_OVERFLOW: return TOOLKIT_EIO; case ERROR_FILEMARK_DETECTED: return TOOLKIT_EIO; case ERROR_GEN_FAILURE: return TOOLKIT_EIO; case ERROR_INVALID_BLOCK_LENGTH: return TOOLKIT_EIO; case ERROR_IO_DEVICE: return TOOLKIT_EIO; case ERROR_NO_DATA_DETECTED: return TOOLKIT_EIO; case ERROR_NO_SIGNAL_SENT: return TOOLKIT_EIO; case ERROR_OPEN_FAILED: return TOOLKIT_EIO; case ERROR_SETMARK_DETECTED: return TOOLKIT_EIO; case ERROR_SIGNAL_REFUSED: return TOOLKIT_EIO; case WSAEISCONN: return TOOLKIT_EISCONN; case ERROR_CANT_RESOLVE_FILENAME: return TOOLKIT_ELOOP; case ERROR_TOO_MANY_OPEN_FILES: return TOOLKIT_EMFILE; case WSAEMFILE: return TOOLKIT_EMFILE; case WSAEMSGSIZE: return TOOLKIT_EMSGSIZE; case ERROR_FILENAME_EXCED_RANGE: return TOOLKIT_ENAMETOOLONG; case ERROR_NETWORK_UNREACHABLE: return TOOLKIT_ENETUNREACH; case WSAENETUNREACH: return TOOLKIT_ENETUNREACH; case WSAENOBUFS: return TOOLKIT_ENOBUFS; case ERROR_BAD_PATHNAME: return TOOLKIT_ENOENT; case ERROR_DIRECTORY: return TOOLKIT_ENOENT; case ERROR_ENVVAR_NOT_FOUND: return TOOLKIT_ENOENT; case ERROR_FILE_NOT_FOUND: return TOOLKIT_ENOENT; case ERROR_INVALID_NAME: return TOOLKIT_ENOENT; case ERROR_INVALID_DRIVE: return TOOLKIT_ENOENT; case ERROR_INVALID_REPARSE_DATA: return TOOLKIT_ENOENT; case ERROR_MOD_NOT_FOUND: return TOOLKIT_ENOENT; case ERROR_PATH_NOT_FOUND: return TOOLKIT_ENOENT; case WSAHOST_NOT_FOUND: return TOOLKIT_ENOENT; case WSANO_DATA: return TOOLKIT_ENOENT; case ERROR_NOT_ENOUGH_MEMORY: return TOOLKIT_ENOMEM; case ERROR_OUTOFMEMORY: return TOOLKIT_ENOMEM; case ERROR_CANNOT_MAKE: return TOOLKIT_ENOSPC; case ERROR_DISK_FULL: return TOOLKIT_ENOSPC; case ERROR_EA_TABLE_FULL: return TOOLKIT_ENOSPC; case ERROR_END_OF_MEDIA: return TOOLKIT_ENOSPC; case ERROR_HANDLE_DISK_FULL: return TOOLKIT_ENOSPC; case ERROR_NOT_CONNECTED: return TOOLKIT_ENOTCONN; case WSAENOTCONN: return TOOLKIT_ENOTCONN; case ERROR_DIR_NOT_EMPTY: return TOOLKIT_ENOTEMPTY; case WSAENOTSOCK: return TOOLKIT_ENOTSOCK; case ERROR_NOT_SUPPORTED: return TOOLKIT_ENOTSUP; case ERROR_BROKEN_PIPE: return TOOLKIT_EOF; case ERROR_ACCESS_DENIED: return TOOLKIT_EPERM; case ERROR_PRIVILEGE_NOT_HELD: return TOOLKIT_EPERM; case ERROR_BAD_PIPE: return TOOLKIT_EPIPE; case ERROR_NO_DATA: return TOOLKIT_EPIPE; case ERROR_PIPE_NOT_CONNECTED: return TOOLKIT_EPIPE; case WSAESHUTDOWN: return TOOLKIT_EPIPE; case WSAEPROTONOSUPPORT: return TOOLKIT_EPROTONOSUPPORT; case ERROR_WRITE_PROTECT: return TOOLKIT_EROFS; case ERROR_SEM_TIMEOUT: return TOOLKIT_ETIMEDOUT; case WSAETIMEDOUT: return TOOLKIT_ETIMEDOUT; case ERROR_NOT_SAME_DEVICE: return TOOLKIT_EXDEV; case ERROR_INVALID_FUNCTION: return TOOLKIT_EISDIR; case ERROR_META_EXPANSION_TOO_LONG: return TOOLKIT_E2BIG; default: return TOOLKIT_UNKNOWN; } } /* * Display an error message and abort the routine. */ void toolkit_fatal_error(const int errorno, const char* syscall) { char* buf = NULL; const char* errmsg; FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); if (buf) { errmsg = buf; } else { errmsg = "Unknown error"; } /* FormatMessage messages include a newline character already, so don't add * another. */ if (syscall) { fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg); } else { fprintf(stderr, "(%d) %s", errorno, errmsg); } if (buf) { LocalFree(buf); } DebugBreak(); abort(); }