1/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to 5 * deal in the Software without restriction, including without limitation the 6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 * sell copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 * IN THE SOFTWARE. 20 */ 21 22#include <assert.h> 23#include <errno.h> 24#include <stdio.h> 25#include <string.h> 26#include <stdlib.h> 27 28#include "uv.h" 29#include "internal.h" 30 31 32/* 33 * Display an error message and abort the event loop. 34 */ 35void uv_fatal_error(const int errorno, const char* syscall) { 36 char* buf = NULL; 37 const char* errmsg; 38 39 FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 40 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, 41 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); 42 43 if (buf) { 44 errmsg = buf; 45 } else { 46 errmsg = "Unknown error"; 47 } 48 49 /* FormatMessage messages include a newline character already, so don't add 50 * another. */ 51 if (syscall) { 52 fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg); 53 } else { 54 fprintf(stderr, "(%d) %s", errorno, errmsg); 55 } 56 57 if (buf) { 58 LocalFree(buf); 59 } 60 61 DebugBreak(); 62 abort(); 63} 64 65 66int uv_translate_sys_error(int sys_errno) { 67 if (sys_errno <= 0) { 68 return sys_errno; /* If < 0 then it's already a libuv error. */ 69 } 70 71 switch (sys_errno) { 72 case ERROR_NOACCESS: return UV_EACCES; 73 case WSAEACCES: return UV_EACCES; 74 case ERROR_ELEVATION_REQUIRED: return UV_EACCES; 75 case ERROR_CANT_ACCESS_FILE: return UV_EACCES; 76 case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; 77 case WSAEADDRINUSE: return UV_EADDRINUSE; 78 case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL; 79 case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; 80 case WSAEWOULDBLOCK: return UV_EAGAIN; 81 case WSAEALREADY: return UV_EALREADY; 82 case ERROR_INVALID_FLAGS: return UV_EBADF; 83 case ERROR_INVALID_HANDLE: return UV_EBADF; 84 case ERROR_LOCK_VIOLATION: return UV_EBUSY; 85 case ERROR_PIPE_BUSY: return UV_EBUSY; 86 case ERROR_SHARING_VIOLATION: return UV_EBUSY; 87 case ERROR_OPERATION_ABORTED: return UV_ECANCELED; 88 case WSAEINTR: return UV_ECANCELED; 89 case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; 90 case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; 91 case WSAECONNABORTED: return UV_ECONNABORTED; 92 case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; 93 case WSAECONNREFUSED: return UV_ECONNREFUSED; 94 case ERROR_NETNAME_DELETED: return UV_ECONNRESET; 95 case WSAECONNRESET: return UV_ECONNRESET; 96 case ERROR_ALREADY_EXISTS: return UV_EEXIST; 97 case ERROR_FILE_EXISTS: return UV_EEXIST; 98 case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; 99 case WSAEFAULT: return UV_EFAULT; 100 case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; 101 case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; 102 case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; 103 case ERROR_INVALID_DATA: return UV_EINVAL; 104 case ERROR_INVALID_PARAMETER: return UV_EINVAL; 105 case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; 106 case WSAEINVAL: return UV_EINVAL; 107 case WSAEPFNOSUPPORT: return UV_EINVAL; 108 case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; 109 case ERROR_BUS_RESET: return UV_EIO; 110 case ERROR_CRC: return UV_EIO; 111 case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; 112 case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; 113 case ERROR_DISK_CORRUPT: return UV_EIO; 114 case ERROR_EOM_OVERFLOW: return UV_EIO; 115 case ERROR_FILEMARK_DETECTED: return UV_EIO; 116 case ERROR_GEN_FAILURE: return UV_EIO; 117 case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; 118 case ERROR_IO_DEVICE: return UV_EIO; 119 case ERROR_NO_DATA_DETECTED: return UV_EIO; 120 case ERROR_NO_SIGNAL_SENT: return UV_EIO; 121 case ERROR_OPEN_FAILED: return UV_EIO; 122 case ERROR_SETMARK_DETECTED: return UV_EIO; 123 case ERROR_SIGNAL_REFUSED: return UV_EIO; 124 case WSAEISCONN: return UV_EISCONN; 125 case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; 126 case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; 127 case WSAEMFILE: return UV_EMFILE; 128 case WSAEMSGSIZE: return UV_EMSGSIZE; 129 case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; 130 case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; 131 case WSAENETUNREACH: return UV_ENETUNREACH; 132 case WSAENOBUFS: return UV_ENOBUFS; 133 case ERROR_BAD_PATHNAME: return UV_ENOENT; 134 case ERROR_DIRECTORY: return UV_ENOENT; 135 case ERROR_ENVVAR_NOT_FOUND: return UV_ENOENT; 136 case ERROR_FILE_NOT_FOUND: return UV_ENOENT; 137 case ERROR_INVALID_NAME: return UV_ENOENT; 138 case ERROR_INVALID_DRIVE: return UV_ENOENT; 139 case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; 140 case ERROR_MOD_NOT_FOUND: return UV_ENOENT; 141 case ERROR_PATH_NOT_FOUND: return UV_ENOENT; 142 case WSAHOST_NOT_FOUND: return UV_ENOENT; 143 case WSANO_DATA: return UV_ENOENT; 144 case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; 145 case ERROR_OUTOFMEMORY: return UV_ENOMEM; 146 case ERROR_CANNOT_MAKE: return UV_ENOSPC; 147 case ERROR_DISK_FULL: return UV_ENOSPC; 148 case ERROR_EA_TABLE_FULL: return UV_ENOSPC; 149 case ERROR_END_OF_MEDIA: return UV_ENOSPC; 150 case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; 151 case ERROR_NOT_CONNECTED: return UV_ENOTCONN; 152 case WSAENOTCONN: return UV_ENOTCONN; 153 case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; 154 case WSAENOTSOCK: return UV_ENOTSOCK; 155 case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; 156 case ERROR_BROKEN_PIPE: return UV_EOF; 157 case ERROR_ACCESS_DENIED: return UV_EPERM; 158 case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; 159 case ERROR_BAD_PIPE: return UV_EPIPE; 160 case ERROR_NO_DATA: return UV_EPIPE; 161 case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; 162 case WSAESHUTDOWN: return UV_EPIPE; 163 case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; 164 case ERROR_WRITE_PROTECT: return UV_EROFS; 165 case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; 166 case WSAETIMEDOUT: return UV_ETIMEDOUT; 167 case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; 168 case ERROR_INVALID_FUNCTION: return UV_EISDIR; 169 case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG; 170 case WSAESOCKTNOSUPPORT: return UV_ESOCKTNOSUPPORT; 171 default: return UV_UNKNOWN; 172 } 173} 174