error.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "precompile.h"
  2. #include "toolkit.h"
  3. int toolkit_translate_sys_error(int sys_errno) {
  4. if (sys_errno <= 0) {
  5. return sys_errno; /* If < 0 then it's already a libuv error. */
  6. }
  7. switch (sys_errno) {
  8. case ERROR_NOACCESS: return TOOLKIT_EACCES;
  9. case WSAEACCES: return TOOLKIT_EACCES;
  10. case ERROR_ELEVATION_REQUIRED: return TOOLKIT_EACCES;
  11. case ERROR_ADDRESS_ALREADY_ASSOCIATED: return TOOLKIT_EADDRINUSE;
  12. case WSAEADDRINUSE: return TOOLKIT_EADDRINUSE;
  13. case WSAEADDRNOTAVAIL: return TOOLKIT_EADDRNOTAVAIL;
  14. case WSAEAFNOSUPPORT: return TOOLKIT_EAFNOSUPPORT;
  15. case WSAEWOULDBLOCK: return TOOLKIT_EAGAIN;
  16. case WSAEALREADY: return TOOLKIT_EALREADY;
  17. case ERROR_INVALID_FLAGS: return TOOLKIT_EBADF;
  18. case ERROR_INVALID_HANDLE: return TOOLKIT_EBADF;
  19. case ERROR_LOCK_VIOLATION: return TOOLKIT_EBUSY;
  20. case ERROR_PIPE_BUSY: return TOOLKIT_EBUSY;
  21. case ERROR_SHARING_VIOLATION: return TOOLKIT_EBUSY;
  22. case ERROR_OPERATION_ABORTED: return TOOLKIT_ECANCELED;
  23. case WSAEINTR: return TOOLKIT_ECANCELED;
  24. case ERROR_NO_UNICODE_TRANSLATION: return TOOLKIT_ECHARSET;
  25. case ERROR_CONNECTION_ABORTED: return TOOLKIT_ECONNABORTED;
  26. case WSAECONNABORTED: return TOOLKIT_ECONNABORTED;
  27. case ERROR_CONNECTION_REFUSED: return TOOLKIT_ECONNREFUSED;
  28. case WSAECONNREFUSED: return TOOLKIT_ECONNREFUSED;
  29. case ERROR_NETNAME_DELETED: return TOOLKIT_ECONNRESET;
  30. case WSAECONNRESET: return TOOLKIT_ECONNRESET;
  31. case ERROR_ALREADY_EXISTS: return TOOLKIT_EEXIST;
  32. case ERROR_FILE_EXISTS: return TOOLKIT_EEXIST;
  33. case ERROR_BUFFER_OVERFLOW: return TOOLKIT_EFAULT;
  34. case WSAEFAULT: return TOOLKIT_EFAULT;
  35. case ERROR_HOST_UNREACHABLE: return TOOLKIT_EHOSTUNREACH;
  36. case WSAEHOSTUNREACH: return TOOLKIT_EHOSTUNREACH;
  37. case ERROR_INSUFFICIENT_BUFFER: return TOOLKIT_EINVAL;
  38. case ERROR_INVALID_DATA: return TOOLKIT_EINVAL;
  39. case ERROR_INVALID_PARAMETER: return TOOLKIT_EINVAL;
  40. case ERROR_SYMLINK_NOT_SUPPORTED: return TOOLKIT_EINVAL;
  41. case WSAEINVAL: return TOOLKIT_EINVAL;
  42. case WSAEPFNOSUPPORT: return TOOLKIT_EINVAL;
  43. case WSAESOCKTNOSUPPORT: return TOOLKIT_EINVAL;
  44. case ERROR_BEGINNING_OF_MEDIA: return TOOLKIT_EIO;
  45. case ERROR_BUS_RESET: return TOOLKIT_EIO;
  46. case ERROR_CRC: return TOOLKIT_EIO;
  47. case ERROR_DEVICE_DOOR_OPEN: return TOOLKIT_EIO;
  48. case ERROR_DEVICE_REQUIRES_CLEANING: return TOOLKIT_EIO;
  49. case ERROR_DISK_CORRUPT: return TOOLKIT_EIO;
  50. case ERROR_EOM_OVERFLOW: return TOOLKIT_EIO;
  51. case ERROR_FILEMARK_DETECTED: return TOOLKIT_EIO;
  52. case ERROR_GEN_FAILURE: return TOOLKIT_EIO;
  53. case ERROR_INVALID_BLOCK_LENGTH: return TOOLKIT_EIO;
  54. case ERROR_IO_DEVICE: return TOOLKIT_EIO;
  55. case ERROR_NO_DATA_DETECTED: return TOOLKIT_EIO;
  56. case ERROR_NO_SIGNAL_SENT: return TOOLKIT_EIO;
  57. case ERROR_OPEN_FAILED: return TOOLKIT_EIO;
  58. case ERROR_SETMARK_DETECTED: return TOOLKIT_EIO;
  59. case ERROR_SIGNAL_REFUSED: return TOOLKIT_EIO;
  60. case WSAEISCONN: return TOOLKIT_EISCONN;
  61. case ERROR_CANT_RESOLVE_FILENAME: return TOOLKIT_ELOOP;
  62. case ERROR_TOO_MANY_OPEN_FILES: return TOOLKIT_EMFILE;
  63. case WSAEMFILE: return TOOLKIT_EMFILE;
  64. case WSAEMSGSIZE: return TOOLKIT_EMSGSIZE;
  65. case ERROR_FILENAME_EXCED_RANGE: return TOOLKIT_ENAMETOOLONG;
  66. case ERROR_NETWORK_UNREACHABLE: return TOOLKIT_ENETUNREACH;
  67. case WSAENETUNREACH: return TOOLKIT_ENETUNREACH;
  68. case WSAENOBUFS: return TOOLKIT_ENOBUFS;
  69. case ERROR_BAD_PATHNAME: return TOOLKIT_ENOENT;
  70. case ERROR_DIRECTORY: return TOOLKIT_ENOENT;
  71. case ERROR_ENVVAR_NOT_FOUND: return TOOLKIT_ENOENT;
  72. case ERROR_FILE_NOT_FOUND: return TOOLKIT_ENOENT;
  73. case ERROR_INVALID_NAME: return TOOLKIT_ENOENT;
  74. case ERROR_INVALID_DRIVE: return TOOLKIT_ENOENT;
  75. case ERROR_INVALID_REPARSE_DATA: return TOOLKIT_ENOENT;
  76. case ERROR_MOD_NOT_FOUND: return TOOLKIT_ENOENT;
  77. case ERROR_PATH_NOT_FOUND: return TOOLKIT_ENOENT;
  78. case WSAHOST_NOT_FOUND: return TOOLKIT_ENOENT;
  79. case WSANO_DATA: return TOOLKIT_ENOENT;
  80. case ERROR_NOT_ENOUGH_MEMORY: return TOOLKIT_ENOMEM;
  81. case ERROR_OUTOFMEMORY: return TOOLKIT_ENOMEM;
  82. case ERROR_CANNOT_MAKE: return TOOLKIT_ENOSPC;
  83. case ERROR_DISK_FULL: return TOOLKIT_ENOSPC;
  84. case ERROR_EA_TABLE_FULL: return TOOLKIT_ENOSPC;
  85. case ERROR_END_OF_MEDIA: return TOOLKIT_ENOSPC;
  86. case ERROR_HANDLE_DISK_FULL: return TOOLKIT_ENOSPC;
  87. case ERROR_NOT_CONNECTED: return TOOLKIT_ENOTCONN;
  88. case WSAENOTCONN: return TOOLKIT_ENOTCONN;
  89. case ERROR_DIR_NOT_EMPTY: return TOOLKIT_ENOTEMPTY;
  90. case WSAENOTSOCK: return TOOLKIT_ENOTSOCK;
  91. case ERROR_NOT_SUPPORTED: return TOOLKIT_ENOTSUP;
  92. case ERROR_BROKEN_PIPE: return TOOLKIT_EOF;
  93. case ERROR_ACCESS_DENIED: return TOOLKIT_EPERM;
  94. case ERROR_PRIVILEGE_NOT_HELD: return TOOLKIT_EPERM;
  95. case ERROR_BAD_PIPE: return TOOLKIT_EPIPE;
  96. case ERROR_NO_DATA: return TOOLKIT_EPIPE;
  97. case ERROR_PIPE_NOT_CONNECTED: return TOOLKIT_EPIPE;
  98. case WSAESHUTDOWN: return TOOLKIT_EPIPE;
  99. case WSAEPROTONOSUPPORT: return TOOLKIT_EPROTONOSUPPORT;
  100. case ERROR_WRITE_PROTECT: return TOOLKIT_EROFS;
  101. case ERROR_SEM_TIMEOUT: return TOOLKIT_ETIMEDOUT;
  102. case WSAETIMEDOUT: return TOOLKIT_ETIMEDOUT;
  103. case ERROR_NOT_SAME_DEVICE: return TOOLKIT_EXDEV;
  104. case ERROR_INVALID_FUNCTION: return TOOLKIT_EISDIR;
  105. case ERROR_META_EXPANSION_TOO_LONG: return TOOLKIT_E2BIG;
  106. default: return TOOLKIT_UNKNOWN;
  107. }
  108. }
  109. /*
  110. * Display an error message and abort the event loop.
  111. */
  112. void toolkit_fatal_error(const int errorno, const char* syscall)
  113. {
  114. char* buf = NULL;
  115. const char* errmsg;
  116. FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
  117. FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
  118. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL);
  119. if (buf) {
  120. errmsg = buf;
  121. }
  122. else {
  123. errmsg = "Unknown error";
  124. }
  125. /* FormatMessage messages include a newline character already, so don't add
  126. * another. */
  127. if (syscall) {
  128. fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg);
  129. }
  130. else {
  131. fprintf(stderr, "(%d) %s", errorno, errmsg);
  132. }
  133. if (buf) {
  134. LocalFree(buf);
  135. }
  136. DebugBreak();
  137. abort();
  138. }