No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Error.cpp 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "il2cpp-config.h"
  2. #if IL2CPP_TARGET_POSIX || IL2CPP_SUPPORT_SOCKETS_POSIX_API
  3. #include "Error.h"
  4. #include "utils/PathUtils.h"
  5. #include <cassert>
  6. #include <errno.h>
  7. #include <unistd.h>
  8. #include <sys/stat.h>
  9. namespace il2cpp
  10. {
  11. namespace os
  12. {
  13. ErrorCode SocketErrnoToErrorCode(int32_t code)
  14. {
  15. ErrorCode result = (ErrorCode) - 1;
  16. switch (code)
  17. {
  18. case 0: result = kErrorCodeSuccess; break;
  19. case EACCES: result = kWSAeacces; break;
  20. #ifdef EADDRINUSE
  21. case EADDRINUSE: result = kWSAeaddrinuse; break;
  22. #endif
  23. #ifdef EAFNOSUPPORT
  24. case EAFNOSUPPORT: result = kWSAeafnosupport; break;
  25. #endif
  26. #if EAGAIN != EWOULDBLOCK
  27. case EAGAIN: result = kWSAewouldblock; break;
  28. #endif
  29. #ifdef EALREADY
  30. case EALREADY: result = kWSAealready; break;
  31. #endif
  32. case EBADF: result = kWSAenotsock; break;
  33. #ifdef ECONNABORTED
  34. case ECONNABORTED: result = kWSAenetdown; break;
  35. #endif
  36. #ifdef ECONNREFUSED
  37. case ECONNREFUSED: result = kWSAeconnrefused; break;
  38. #endif
  39. #ifdef ECONNRESET
  40. case ECONNRESET: result = kWSAeconnreset; break;
  41. #endif
  42. case EFAULT: result = kWSAefault; break;
  43. #ifdef EHOSTUNREACH
  44. case EHOSTUNREACH: result = kWSAehostunreach; break;
  45. #endif
  46. #ifdef EINPROGRESS
  47. case EINPROGRESS: result = kWSAeinprogress; break;
  48. #endif
  49. case EINTR: result = kWSAeintr; break;
  50. case EINVAL: result = kWSAeinval; break;
  51. // FIXME: case EIO: result = WSAE????; break;
  52. #ifdef EISCONN
  53. case EISCONN: result = kWSAeisconn; break;
  54. #endif
  55. // FIXME: case ELOOP: result = WSA????; break;
  56. case EMFILE: result = kWSAemfile; break;
  57. #ifdef EMSGSIZE
  58. case EMSGSIZE: result = kWSAemsgsize; break;
  59. #endif
  60. // FIXME: case ENAMETOOLONG: result = kWSAeacces; break;
  61. #ifdef ENETUNREACH
  62. case ENETUNREACH: result = kWSAenetunreach; break;
  63. #endif
  64. #ifdef ENOBUFS
  65. case ENOBUFS: result = kWSAenobufs; break;
  66. #endif
  67. // case ENOENT: result = WSAE????; break;
  68. case ENOMEM: result = kWSAenobufs; break;
  69. #ifdef ENOPROTOOPT
  70. case ENOPROTOOPT: result = kWSAenoprotoopt; break;
  71. #endif
  72. #ifdef ENOSR
  73. case ENOSR: result = kWSAenetdown; break;
  74. #endif
  75. #ifdef ENOTCONN
  76. case ENOTCONN: result = kWSAenotconn; break;
  77. #endif
  78. // FIXME: case ENOTDIR: result = WSAE????; break;
  79. #ifdef ENOTSOCK
  80. case ENOTSOCK: result = kWSAenotsock; break;
  81. #endif
  82. case ENOTTY: result = kWSAenotsock; break;
  83. #ifdef EOPNOTSUPP
  84. case EOPNOTSUPP: result = kWSAeopnotsupp; break;
  85. #endif
  86. case EPERM: result = kWSAeacces; break;
  87. case EPIPE: result = kWSAeshutdown; break;
  88. #ifdef EPROTONOSUPPORT
  89. case EPROTONOSUPPORT: result = kWSAeprotonosupport; break;
  90. #endif
  91. #if ERESTARTSYS
  92. case ERESTARTSYS: result = kWSAenetdown; break;
  93. #endif
  94. // FIXME: case EROFS: result = WSAE????; break;
  95. #ifdef ESOCKTNOSUPPORT
  96. case ESOCKTNOSUPPORT: result = kWSAesocktnosupport; break;
  97. #endif
  98. #ifdef ETIMEDOUT
  99. case ETIMEDOUT: result = kWSAetimedout; break;
  100. #endif
  101. #ifdef EWOULDBLOCK
  102. case EWOULDBLOCK: result = kWSAewouldblock; break;
  103. #endif
  104. #ifdef EADDRNOTAVAIL
  105. case EADDRNOTAVAIL: result = kWSAeaddrnotavail; break;
  106. #endif
  107. case ENOENT: result = kWSAeconnrefused; break;
  108. #ifdef EDESTADDRREQ
  109. case EDESTADDRREQ: result = kWSAedestaddrreq; break;
  110. #endif
  111. case ENODEV: result = kWSAenetdown; break;
  112. #ifdef EHOSTDOWN
  113. case EHOSTDOWN: result = kWSAehostdown; break;
  114. #endif
  115. #ifdef ENXIO
  116. case ENXIO: result = kWSAhostNotFound; break;
  117. #endif
  118. default:
  119. result = kWSAsyscallfailure;
  120. break;
  121. }
  122. return result;
  123. }
  124. ErrorCode FileErrnoToErrorCode(int32_t code)
  125. {
  126. ErrorCode ret;
  127. /* mapping ideas borrowed from wine. they may need some work */
  128. switch (code)
  129. {
  130. case EACCES: case EPERM: case EROFS:
  131. ret = kErrorCodeAccessDenied;
  132. break;
  133. case EAGAIN:
  134. ret = kErrorCodeSharingViolation;
  135. break;
  136. case EBUSY:
  137. ret = kErrorCodeLockViolation;
  138. break;
  139. case EEXIST:
  140. ret = kErrorCodeFileExists;
  141. break;
  142. case EINVAL: case ESPIPE:
  143. ret = kErrorSeek;
  144. break;
  145. case EISDIR:
  146. ret = kErrorCodeCannotMake;
  147. break;
  148. case ENFILE: case EMFILE:
  149. ret = kErrorCodeTooManyOpenFiles;
  150. break;
  151. case ENOENT: case ENOTDIR:
  152. ret = kErrorCodeFileNotFound;
  153. break;
  154. case ENOSPC:
  155. ret = kErrorCodeHandleDiskFull;
  156. break;
  157. case ENOTEMPTY:
  158. ret = kErrorCodeDirNotEmpty;
  159. break;
  160. case ENOEXEC:
  161. ret = kErrorBadFormat;
  162. break;
  163. case ENAMETOOLONG:
  164. ret = kErrorCodeFileNameExcedRange;
  165. break;
  166. #ifdef EINPROGRESS
  167. case EINPROGRESS:
  168. ret = kErrorIoPending;
  169. break;
  170. #endif
  171. case ENOSYS:
  172. ret = kErrorNotSupported;
  173. break;
  174. case EBADF:
  175. ret = kErrorCodeInvalidHandle;
  176. break;
  177. case EIO:
  178. ret = kErrorCodeInvalidHandle;
  179. break;
  180. case EINTR:
  181. ret = kErrorIoPending;
  182. break;
  183. case EPIPE:
  184. ret = kErrorCodeWriteFault;
  185. break;
  186. default:
  187. ret = kErrorCodeGenFailure;
  188. break;
  189. }
  190. return ret;
  191. }
  192. ErrorCode PathErrnoToErrorCode(const std::string& path, int32_t code)
  193. {
  194. if (code == ENOENT)
  195. {
  196. const std::string dirname(il2cpp::utils::PathUtils::DirectoryName(path));
  197. #if !IL2CPP_HAS_NOACCESS
  198. if (access(dirname.c_str(), F_OK) == 0)
  199. return kErrorCodeFileNotFound;
  200. #else
  201. struct stat statInfo;
  202. if (stat(dirname.c_str(), &statInfo) == 0 && S_ISDIR(statInfo.st_mode))
  203. return kErrorCodeFileNotFound;
  204. #endif
  205. else
  206. return kErrorCodePathNotFound;
  207. }
  208. else
  209. {
  210. return FileErrnoToErrorCode(code);
  211. }
  212. }
  213. }
  214. }
  215. #endif